+ -
当前位置:首页 → 问答吧 → 哈希数组太大,能否先取出一部分输入文件?

哈希数组太大,能否先取出一部分输入文件?

时间:2010-12-22

来源:互联网

我的数据:
  1. 4272    40
  2. 4272    45
  3. 4273    75
  4. 4273    65
  5. 4284    30
  6. 4293    75
  7. 4294    45
  8. 4296    20
  9. 4296    15
  10. 4296    10
  11. 4296    70
  12. 4296    75
  13. 4296    75
  14. 4296    75
  15. 4296    30
  16. 4296    75
  17. 4299    45
  18. 4299    60
复制代码


第一列表示在一条序列中的位置,第二列数据表示第一列数据往后的覆盖范围。我现在要统计每个位置被覆盖的次数。比如数据中第5行的4284位置,被前5行数据覆盖,覆盖次数为5。

代码:
  1. open(FILE,"$IN") or die "$!";
  2. open(OUT,">>$OUT")or die "$!";

  3. my %cov;

  4. while(<FILE>)
  5. {
  6. my @c=split /\s+/,$_;
  7. for($i=$c[0];$i<=$c[0]+$c[1]-1;$i++){$cov{$i}++;}
  8. }
  9. foreach my $key (keys %cov)
  10. {print OUT "$key\t$cov{$key}\n";}
  11. close FILE;
  12. close OUT;
复制代码


现在的问题是,文件中有2000多万条数据,也有2000万个位置,全部存在hash数组中,全部统计完,再写入文件,占的内存很大。怎样把已经统计完的hash数值写入文件,不再占用内存?
PS:第一列数据是按顺序排列;第二列数字最大为75;每个位置被覆盖次数不超过100。

作者: nb509   发布时间: 2010-12-22

我在while循环里加了下面的代码,hash超过500,就输入文件,再删除。
  1. my $num=scalar(keys(%cov));
  2.   if($num>=500){ foreach my $key (sort keys(%cov)){ if($key<$c[1]){ print OUT "$key\t$cov{$key}\n"; delete $cov{$key};}}}
  3.   foreach my $key (sort keys %cov){print OUT "$key\t$cov{$key}\n";}
复制代码

作者: nb509   发布时间: 2010-12-22