如何对不适合内存的文本限定CSV文件进行排序?

时间:2015-06-10 12:11:39

标签: python sorting csv windows-server-2008

我有一些大的(20GB +)CSV文件是双引号"我需要排序并输出到新文件的文本合格。

有些文件只按数字排列在一列上,而其他文件则分为两列,第一列是数字,第二列是字符串。

到目前为止,我已经尝试过Pythons csv sort,它失败了,因为它最终耗尽了内存。还有CoreUtils for Windows,虽然排序似乎没有处理文本限定符并给出不正确的结果。

是否有任何推荐/现有的解决方案可以处理这种类型?平台是Windows Server 2008 R2。

1 个答案:

答案 0 :(得分:6)

这里需要一些外部排序技巧。我们的想法是创建较小的排序文件,然后逐个排序并保存在新文件中。这是一个快速摘要。

  1. 将20GB文件拆分为100-1000个文件(取决于系统的性能)
  2. 使用传统的CSV排序方法
  3. 分别对100个文件(块)中的每个文件进行排序
  4. 创建另一个文件,最后是排序的输出。我们称之为RESULT。
  5. 逐行读取第一个文件和RESULT。迭代地将行添加到另一个文件(例如,TEMP)。第一次迭代后,RESULT不会为空。假设当前的块文件包含[1,3,5],RESULT包含[2,4,6],比较它们的最低未读元素。这里,(1,2)。将“1”写入TEMP。在下一次迭代中,您必须比较(3,2)并将'2'写入TEMP。继续。基本思想是常规合并排序的核心。重命名TEMP作为结果并清除TEMP。
  6. 对每个块和RESULT重复此操作。
  7. enter image description here

    当你不断迭代块并且一直保持排序时,RESULT会慢慢增长。迭代结束后,此文件是最终排序的CSV。

    您可以尝试多种算法变体以满足您的需求。查看https://en.wikipedia.org/wiki/External_sorting了解更多详情。

    因此,我能够在一台8GB的计算机上在2-3小时内对40GB文件进行排序,该计算机还运行了其他几个进程。