如何有效地对两个级别的大文件进行排序?

时间:2013-08-12 17:17:15

标签: perl unix sorting

我有一个非常大的文件,超过100GB(数十亿行),我想在内存有限的unix系统上尽可能快地进行两级排序。这将是一个大型perl脚本中的一步,所以我想尽可能使用perl。

那么,我该怎么做呢?我的数据如下:

A    129
B    192
A    388
D    148
D    911
A    117

......但数十亿行。我需要先按字母排序,然后按数字排序。使用unix排序会更容易吗,比如......

sort -k1,2 myfile

或者我能以某种方式在perl中完成这一切吗?我的系统将有16GB内存,但文件大约是100GB。

感谢您的任何建议!

3 个答案:

答案 0 :(得分:8)

UNIX sort实用程序可以通过在磁盘空间上创建临时工作文件来处理大数据的排序(例如,大于工作的16GB RAM)。

因此,我建议您根据建议使用UNIX sort,调用选项-T tmp_dir,并确保tmp_dir有足够的磁盘空间来容纳所有将在那里创建的临时工作文件。

顺便说一句,这在previous SO question.

中进行了讨论

答案 1 :(得分:1)

UNIX sort是排序此规模数据的最佳选择。我建议使用快速压缩算法LZO。它通常以lzop分发。使用-S选项设置大排序缓冲区。如果您的某个磁盘速度比默认/tmp设置-T的速度快。此外,如果要按数字排序,则必须将排序编号排序定义为第二个排序字段。所以你应该使用这样的行来获得最佳性能:

LC_ALL=C sort -S 90% --compress-program=lzop -k1,1 -k2n

答案 2 :(得分:0)

我有完全相同的问题! 经过大量搜索,因为我不想对shell(UNIX)有任何依赖,使其在Windows上可移植,我提出了以下解决方案:

#!/usr/bin/perl
use File::Sort qw(sort_file);
my $src_dic_name = 'C:\STORAGE\PERSONAL\PROJECTS\perl\test.txt';
sort_file({k => 1, t=>"    ", I => $src_dic_name, o => $src_dic_name.".sorted"});

我知道这是一篇旧帖子,但是使用解决方案进行更新,以便于查找。

Documentation here