如何对非常大的文件进行排序

2022-09-01 09:14:45

我有一些文件应该根据每行开头的id进行排序。这些文件大约是2-3 GB。

我试图将所有数据读入并对其进行排序。但记忆力不足以留住他们所有人。它不起作用。ArrayList

线条看起来像

0052304 0000004000000000000000000000000000000041 John Teddy 000023
0022024 0000004000000000000000000000000000000041 George Clan 00013

如何对文件进行排序?


答案 1

这并不完全是Java问题。您需要研究一种有效的算法,用于对未完全读入内存的数据进行排序。对合并排序的一些调整可以实现这一目标。

看看这个:http://en.wikipedia.org/wiki/Merge_sort

和: http://en.wikipedia.org/wiki/External_sorting

基本上,这里的想法是将文件分解成更小的部分,对它们进行排序(使用合并排序或其他方法),然后使用合并排序中的合并来创建新的排序文件。


答案 2

由于您的记录已经是平面文件文本格式,因此您可以将它们通过管道传输到UNIX中,例如.它将自动将数据分块,并使用可用内存和执行合并排序。如果需要的空间多于可用内存,请添加到命令中。sort(1)sort -n -t' ' -k1,1 < input > output/tmp-T /tmpdir

有趣的是,每个人都告诉你下载大量的C#或Java库,或者自己实现合并排序,当你可以使用一个在每个平台上可用的工具,并且已经存在了几十年。