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

How to sort text qualified CSV file that doesn't fit in memory?

我有一些大型 (20GB+) CSV 文件,这些文件是双引号 " 文本,我需要对其进行排序并输出到新文件。

有些文件仅按数字在一列上排序,而其他文件则在两列上,第一列按数字排序,第二列按字符串排序。

到目前为止,我已经尝试过 Python 的 csv 排序,但由于最终 运行 内存不足而失败。还有 Windows 的 CoreUtils,尽管排序似乎无法处理文本限定符并给出不正确的结果。

是否有任何 recommended/existing 解决方案可以处理这种排序?平台是 Windows Server 2008 R2。

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

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

随着您不断迭代块并始终保持排序,RESULT 会慢慢增长。该文件是迭代结束后最终排序的 CSV。

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

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