row*_*194 8 freebsd sort merge
我正在尝试对 1.4TB 文件进行排序(最好是删除重复行)。
分割和排序各个块不是问题,但重新组装它们却是一个挑战。我从手册页中期望“sort -m”(在 FreeBSD 11 下)会进行简单的合并,创建一个聚合的完美排序的输出,可以选择使用 -u 选项抑制重复项。
但在让它运行一段时间后,我发现 sort(到目前为止)已经生成了数百个临时文件,就像它像平常一样对输入进行排序一样。
我没有足够的磁盘空间来存储相同的数据 3 次。是否有任何实用程序可以对已排序的文件进行简单合并,而不需要临时磁盘空间?
===结果===
我最终使用了“标准”排序。处理过程需要大约 50 个小时的高 CPU 和磁盘负载,其中包括生成数百个临时文件。尽管输入已经被完美排序,但还是如此。我仍然有兴趣了解是否有一个简单的实用程序可以整齐地合并预先排序的文件。
今天用不同的数据做了一些更多的实验,我相信我可能已经发现了问题:默认情况下,sort(BSD)一次只会打开16个文件(手册页似乎暗示这包括输入文件和临时文件)。
--batch-size= 开关将允许增加此计数。
使用大小为 100MB 的预排序文件:
sort -u -m <...15 个文件名...>
sort -u -m <...16 个文件名...>
sort --batch-size=20 -u -m <...16 个文件名...>
请注意,我无法在原始数据上对此进行测试,但我相当确定这就是问题所在。
希望这可以帮助遇到同样问题的人。
您的要求(因此备用内存/存储/云)将使速度变得非常慢,但可以通过编写自己的文件系统驱动程序来实现。但是,如果您有时间/技能来做到这一点,那么租用/购买/出售/退回 37 美元的 2TB 驱动器并使用会更快/更便宜
https://en.m.wikipedia.org/wiki/External_sorting
如果文件可压缩,解决方法可能是 zram 和/或 7z/fs 压缩,您可以为第二个副本腾出空间
https://en.m.wikipedia.org/wiki/Zram
https://en.m.wikipedia.org/wiki/Category:压缩文件系统
如果有空间用于输出而不删除输入并且输入已预先排序,那么它就很简单了。