排序算法:具有可变长度行的大文本文件(以逗号分隔的值)

时间:2010-12-15 18:20:44

标签: algorithm language-agnostic file sorting lines

用于排序大于可用内存(大约10千兆字节)并包含可变长度记录的文本文件的算法是什么?我见过的所有算法都假设1)数据适合内存,或者2)记录是固定长度的。但想象一下我想按“BirthDate”字段(第4个字段)排序的大型CSV文件:

Id,UserId,Name,BirthDate
1,psmith,"Peter Smith","1984/01/01"
2,dmehta,"Divya Mehta","1985/11/23"
3,scohen,"Saul Cohen","1984/08/19"
...
99999999,swright,"Shaun Wright","1986/04/12"
100000000,amarkov,"Anya Markov","1984/10/31"

我知道:

  1. 这将在一台计算机上运行(未分发)。
  2. 我正在运行的机器上有几个处理器。
  3. 我要排序的文件可能比机器的物理内存大。
  4. 文件包含可变长度的行。每行包含固定数量的列(分隔符分隔值)。文件将按特定字段(即文件中的第4个字段)进行排序。
  5. 理想的解决方案可能是“使用此现有排序实用程序”,但我正在寻找最佳算法
  6. 我不期望一个完全编码的,有效的答案;更多的事情是“检查出来,这里是它的工作方式,或者这就是为什么它适用于这个问题。”我只是不知道在哪里看......
  7. 这不是作业!
  8. 谢谢! ♥

4 个答案:

答案 0 :(得分:3)

这类算法称为外部排序。我首先查看Wikipedia entry。它包含一些讨论和指示。

答案 1 :(得分:1)

建议以下资源:

合并排序:http://en.wikipedia.org/wiki/Merge_sort

“数字算法”,计算机程序设计艺术第2卷:Knuth:Addison Wesley:ISBN 0-201-03822-6(v.2)

答案 2 :(得分:0)

标准合并排序方法可行。常见架构是

  1. 将文件拆分为N个大小相等的部分
  2. 对每个部分进行排序(在内存中,如果它足够小,否则递归地应用相同的算法)
  3. 合并已排序的部分

答案 3 :(得分:0)

无需排序。读取文件ALL.CSV并将每个读取行每天附加到文件,如19841231.CSV。对于包含数据的每个现有日期,按数字顺序读取该CSV文件并将这些行附加到新文件。例如,可以通过多次处理原始文件或记录ALL.CSV文件中实际发生的日期来进行优化。

因此,应将包含“1985/02/28”的行添加到文件19850228.CSV中。在将文件19850227.CSV附加到NEW.CSV之后,文件19850228.CSV应附加到NEW.CSV。数字顺序避免使用所有排序算法,尽管它可能会折磨文件系统。

实际上,文件ALL.CSV可以按文件分割,例如,年份。 1984.CSV,1985.CSV,等等。