2012-02-22 80 views
6

我有一个面试前的任务,我已经完成并且解决方案能够正常工作,但是由于使用了TADODataset,我被打了下来并没有接受采访。我基本上导入了一个填充数据集的CSV文件,数据必须以特定的方式处理,所以我使用数据集的过滤和排序来确保数据按我想要的方式排序,然后执行了在while循环中进行逻辑处理。收到的反馈表示这很糟糕,因为它对大文件来说会很慢。从德尔福的CSV文件导入和处理数据

这里我的主要问题是,如果在内存数据集中使用处理大文件的速度较慢,那么从csv文件访问信息的更好方法是什么?我应该使用String List还是类似的东西?

+0

我认为你在给出的规格范围内做得很好。大文件?因此,使用不是基于内存的替代数据库解决方案 - 您的解决方案只是缩放而不改变其他任何内容。 – mj2008 2012-02-22 12:06:59

+0

谢谢mj2008我在写作的时候这么认为,也试图以非常防御性的方式编写解决方案,但考虑到Dorin的答案,我现在可以明白为什么面试官想以不同的方式看到这一点。 – Mattgb 2012-02-22 12:21:25

+0

我同意@ mj2008。将'CSV'与'ADO'联系起来是一个非常好的答案。我本能的解决方案本来是一样的。如果你知道如何用'TADODataset'处理'CSV'文件,那么你肯定知道如何“低技术”一行一行地读取文本文件... – kobik 2012-02-22 13:00:04

回答

3

这实际上取决于任务的“大”和可用资源(在这种情况下是RAM)。

“收到的反馈表示这很糟糕,因为它对大文件来说会很慢。”

CSV文件通常用于移动数据(在大多数情况下,我遇到的文件大约是1MB +高达〜10MB,但这并不是说别人不会将更多数据转储为CSV格式),而不用担心很多(如果有的话)关于进口/出口,因为它非常简单。

假设你有一个80MB的CSV文件,现在这就是你想要的块来处理文件,否则(取决于您的处理),你可以吃数百MB的RAM,在这种情况下,我会做的是:

while dataToProcess do begin 
    // step1 
    read <X> lines from file, where <X> is the max number of lines 
    you read in one go, if there are less lines(i.e. you're down to 50 lines and X is 100) 
    to process, then you read those 
    // step2 
    process information 
    // step3 
    generate output, database inserts, etc. 
end; 

在上面的例子中,你并没有将80MB的数据加载到RAM中,但只有几百KB,其余的用于处理,即链接列表,动态插入查询(批量插入)等。

“......但是我被打倒了,因为使用了TADODataset而没有接受采访。”

我并不感到惊讶,他们可能正在考虑是否有能力创建算法并提供简单的解决方案,但无需使用“现成”解决方案。

他们可能正在考虑看到你使用动态数组并创建一个(或多个)排序算法。

“我应该使用字符串列表还是类似的东西?”

答复可能是一样的,我想他们想看看你是如何“工作”的。

+1

在我的办公室,我们每个月都会处理一个4GB + CSV文件(在其他地方生成并可用zip格式下载)。不用说,ADODataSet或ClientDataSet在这里不是一个可行的解决方案。 :) – 2012-02-22 12:00:49

+0

谢谢你的答案多林,使用动态数组和排序算法只是没有进入我的思维过程。我想我一直在使用Ado和SQL数据库的时间太长了,也许需要考虑解决问题来扩展我的知识。 – Mattgb 2012-02-22 12:08:22

+0

@KenWhite我觉得有人会创建一个4GB的CSV文件,但这并不意味着这是不可能的,那么这是一个笑话还是?坦率地说,从来没有听说过超过~100MB的CSV ...这也是非常不切实际的... – ComputerSaysNo 2012-02-22 12:21:05

0

面试官说的很对。

任何媒体文件的正确的,可扩展的,最快的解决方法向上是使用“外部排序”。

“外部排序”是一个2阶段的过程,第一阶段是将每个文件拆分为可管理和排序的较小文件。第二阶段是将这些文件合并回单个排序文件,然后逐行处理。

对于超过200,000行的任何CSV文件都是非常有效的。可以控制进程运行的内存量,因此可以消除内存不足的危险。

我已经实现了很多这样的排序过程,并且在Delphi中会推荐TStringList,TList和TQueue类的组合。

好运