【问题标题】:How to sort a large file on two levels efficiently?如何有效地在两个级别上对大文件进行排序?
【发布时间】:2013-08-14 02:41:46
【问题描述】:

我有一个非常大的文件,超过 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位数吗?如果不是,它们是否右对齐?如果这两个条件都成立(所有 3 位数字或右对齐),那么您只需要单级文本排序。
  • @Jim,感谢您的评论。不,数字范围从 1 到 100,000,000,这些只是较大电子表格(基因组测序数据)中不相邻的两列

标签: perl unix sorting


【解决方案1】:

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

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

顺便说一句,这在previous SO question.中讨论过

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我遇到了完全相同的问题! 经过大量搜索,由于我不希望对 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

      【讨论】:

        猜你喜欢
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-28
        • 2019-10-11
        • 2013-05-15
        相关资源
        最近更新 更多