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

2024-06-16 08:25:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些大的(20GB以上)CSV文件,是双引号“文本限定,我需要排序和输出到一个新的文件。

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

到目前为止,我尝试过Pythons csv sort,但失败了,因为它最终耗尽了内存。以及CoreUtils for Windows,尽管sort似乎无法处理文本限定符并给出错误的结果。

是否有任何建议/现有的解决方案可以处理此类问题?平台为Windows Server 2008 R2。


Tags: 文件csv内存字符串文本for排序windows
1条回答
网友
1楼 · 发布于 2024-06-16 08:25:00

这里你需要一些外部排序技巧。这个想法是创建更小的排序文件,然后逐个排序并保存在新文件中。下面是一个简短的总结。在

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

enter image description here

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

你可以尝试几种不同的算法来满足你的需要。有关详细信息,请查看https://en.wikipedia.org/wiki/External_sorting。在

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

相关问题 更多 >