6

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

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

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

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

sort -k1,2 myfile

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

感谢您的任何建议!

4

3 回答 3

8

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

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

顺便说一句,这在之前的 SO question 中讨论过。

于 2013-08-12T17:20:27.070 回答
1

UNIXsort是对这种规模的数据进行排序的最佳选择。我建议使用快速压缩算法LZO。它通常分布为lzop. -S使用选项设置大排序缓冲区。如果你有一些磁盘比你有默认/tmp设置的地方还快-T。此外,如果要按数字排序,则必须将排序数字排序定义为第二个排序字段。所以你应该使用这样的线以获得最佳性能:

LC_ALL=C sort -S 90% --compress-program=lzop -k1,1 -k2n
于 2013-08-12T21:20:25.050 回答
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"});

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

文档在这里

于 2016-01-13T13:43:35.380 回答