免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6384 | 回复: 12
打印 上一主题 下一主题

【求助】关于一个out of memory的问题 [复制链接]

论坛徽章:
1
金牛座
日期:2013-09-06 08:50:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-22 21:58 |只看该作者 |倒序浏览
32G的内存,在运行一个perl脚本时提示out of memory!
以下是程序的一部分,有人知道么?
  1. #@{$fh{$key}}存储文件名为$key的文件内容;
  2. #所有的key文件读完之后内存使用在1.5G左右;
  3. #以下是程序的一部分;
  4. for my $in(@file){                            #   9个输入文件@file大小总共在20M左右;
  5.         open IN,"<","$in" or die "Can't open $in!\n";
  6.         my @array;
  7.         map {chomp;next if(/^\s*$/);push @array,[split('\t',$_)]} <IN>;            
  8.         close IN;
  9.         open OUT,">","$in.out";
  10.         for my $gene(@array){
  11.                 my $num=0;
  12.                 foreach my $line(@{$fh{$gene->[0]}}){
  13.                         last if ($gene->[1] <= $line);
  14.                         $num++ if ($line > $gene->[1]);     
  15.                 }
  16.                 print OUT "$num\n";
  17.         }
  18.         close OUT;
  19. }
复制代码

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
2 [报告]
发表于 2013-12-23 01:04 |只看该作者

在第7行有一个错误,但问题不是在这里~

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2013-12-23 06:41 |只看该作者
map不应该这么用。你该用foreach/for循环

你把代码写的可读性高一些,错误就很容易检查出来了

论坛徽章:
0
4 [报告]
发表于 2013-12-23 08:32 |只看该作者
边读边写就没问题了。

论坛徽章:
1
金牛座
日期:2013-09-06 08:50:31
5 [报告]
发表于 2013-12-23 09:34 |只看该作者
回复 4# 大米白面
边读边写太慢了,所以我想一次性全读进去,感觉不是内存的问题,因为8G和32G的电脑都卡在差不多的地方就停了。


   

论坛徽章:
1
金牛座
日期:2013-09-06 08:50:31
6 [报告]
发表于 2013-12-23 09:48 |只看该作者
本帖最后由 飞越地平线 于 2013-12-23 10:09 编辑

回复 3# py
@rubyish

是什么错误?语法没有提示错误,我以为是正常的。。
我用8G的和32G的电脑跑了下,都差不多在生成1.3M大小的文件的时候停住了。不知道是什么原因?
本人菜鸟,才刚学编程,还没有遇到过out of memory的问题。。求大神指点指点。。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2013-12-23 10:47 |只看该作者
map 里面那个 next 作用的是外层的 for my $in (@file) { 循环

错误有语法错误这个编译器可以帮你,但还有逻辑错误

论坛徽章:
1
金牛座
日期:2013-09-06 08:50:31
8 [报告]
发表于 2013-12-23 10:54 |只看该作者
回复 7# zhlong8
以前也犯过这个错误。。,这次又犯了一次!!

   

论坛徽章:
1
金牛座
日期:2013-09-06 08:50:31
9 [报告]
发表于 2013-12-23 12:00 |只看该作者
回复 2# rubyish
  1. #@{$fh{$key}}存储文件名为$key的文件内容;
  2. #所有的key文件读完之后内存使用在1.5G左右;
  3. #以下是程序的一部分;
  4. my @file = glob "$dir\\*bed";
  5. my @bed = glob "$dir3\\*";

  6. for (@bed){
  7.         my $name = $_;
  8.         $name =~ s/.*bed_(.+)_(.+)\.bed/$1$2/;
  9.         $fdir{$name} = $_;
  10. }
  11. while(my ($key, $value)= each %fdir){
  12.         open BED,"<","$fdir{$key}" or die "Can't open file: $key!\n";
  13.         @{$fh{$key}} = map {
  14.                                                 chomp;
  15.                                                 (split '\t')[2];
  16.                                                 } <BED>;
  17.         close BED;
  18. }

  19. print "Begin\n";
  20. for my $in(@file){                            #   9个输入文件@file大小总共在20M左右;
  21.         open IN,"<","$in" or die "Can't open $in!\n";
  22.         my @array;
  23.                 while(<IN>){
  24.                         chomp;
  25.                         next if(/^\s*$/);
  26.                         push @array,[split('\t',$_)];
  27.                 }
  28.         close IN;
  29.         open OUT,">","$in.out";
  30.         for my $gene(@array){
  31.                 my $num=0;
  32.                 foreach my $line(@{$fh{$gene->[0]}}){               #平均有1800000行;
  33.                         last if ($gene->[1] <= $line);
  34.                         $num++ if ($line > $gene->[1]);     
  35.                 }
  36.                 print OUT "$num\n";
  37.         }
  38.         close OUT;
  39. }
复制代码
大侠们,代码差不多就是这样了;
但是还是有问题,我用的是win7,内存使用在4.5G的时候就提示out of memory了。电脑内存有8G

   

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
10 [报告]
发表于 2013-12-24 02:48 |只看该作者
哦。水平有限, 看不出生成 out of memory 的问题。
你贴文件内容,说你的意图, 帮你改写也许更快解决问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP