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

mhe*_*all 0 python csv sorting windows-server-2008

我有一些大的(20GB +)CSV文件是双引号"文本限定,我需要排序并输出到一个新文件.

有些文件只是按数字排序在一列上,而其他文件在两列上排序,第一列是数字,第二列是字符串.

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

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

Adi*_*tya 6

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

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

在此输入图像描述

因此,当您继续迭代块并且一直保持排序时,RESULT会逐渐增长.迭代结束后,此文件是最终排序的CSV.

您可以尝试多种算法变体以满足您的需求.有关详细信息,请查看https://en.wikipedia.org/wiki/External_sorting.

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