- 论坛徽章:
- 11
|
这帖子没结果了。。。
好奇之下,下了LZ的数据文件,解压2.5GB,还好电脑内存16GB,按照前面你们的perl代码执行前50M行(总数的1/3),物理内存占用超过6GB,意味着全部数据16GB内存都可能hold不住:- $ head -50000000 tt1.txt | ./reduce.pl
- PID %CPU %MEM RSS NSWAP ELAPSED COMM
- 479 99.1 40.0 6711876 - 01:34 /usr/bin/perl
复制代码 其实看这个50M,只要内存够,执行时间1分34秒,还能等。
把原文件按照每行排序后的最大数字,模11,分为11个文件,每个文件行数分布比较均匀:- #!/usr/bin/perl
- use strict;
- use warnings;
- my $modulo = 11;
- my @files = ();
- for (0 .. $modulo-1) {
- open $files[$_], ">", "map_$_.txt"
- or die "could not open map_$_.txt: $!";
- }
- while (<>) {
- chomp;
- my ($f1, $f2, $f3) = sort {$a <=> $b} split /\t/;
- print {$files[$f3 % $modulo]} "$f1\t$f2\t$f3\n";
- }
复制代码- 13282037 13358435 13856488 13894659 13915435 14064033 14125693 14858455 14869804 15549080 16652976
复制代码 最后对每个文件再运行你们的perl代码,生成11个新的文件就是最终结果,wc统计了下,重复行不到1%,印证了开始的想法,16GB内存都搞不定,必须切割小文件处理。
|
|