这实际上取决于任务的“大”和可用资源(在这种情况下是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而没有接受采访。”
我并不感到惊讶,他们可能正在考虑是否有能力创建算法并提供简单的解决方案,但无需使用“现成”解决方案。
他们可能正在考虑看到你使用动态数组并创建一个(或多个)排序算法。
“我应该使用字符串列表还是类似的东西?”
答复可能是一样的,我想他们想看看你是如何“工作”的。
我认为你在给出的规格范围内做得很好。大文件?因此,使用不是基于内存的替代数据库解决方案 - 您的解决方案只是缩放而不改变其他任何内容。 – mj2008 2012-02-22 12:06:59
谢谢mj2008我在写作的时候这么认为,也试图以非常防御性的方式编写解决方案,但考虑到Dorin的答案,我现在可以明白为什么面试官想以不同的方式看到这一点。 – Mattgb 2012-02-22 12:21:25
我同意@ mj2008。将'CSV'与'ADO'联系起来是一个非常好的答案。我本能的解决方案本来是一样的。如果你知道如何用'TADODataset'处理'CSV'文件,那么你肯定知道如何“低技术”一行一行地读取文本文件... – kobik 2012-02-22 13:00:04