免费注册 查看新帖 |

Chinaunix

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

内存溢出问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-29 16:55 |只看该作者 |倒序浏览
我想做的是在一个网络中从某个给定的节点开始查找通路,查找条件是这样子的:从一个节点开始,其相邻节点的betweenness值最大的那个点作为下一个节点,再重复此过程,直到通路的终点。
  1. use strict;
  2. use warnings;
  3. my ($seeds,$j,$bigger);
  4. my (@path,@protein,@select_temp);
  5. my %protein_betweenness;
  6. #将每个蛋白质的betweenness存入一个hash表中。
  7. open(my $protein_betweenness,"protein_betweenness.txt")or die $!;
  8. while(my $pro_bet = <$protein_betweenness>){
  9.         chomp($pro_bet);
  10.         my @pro_bet_temp = split/\t/,$pro_bet;
  11.         $protein_betweenness{$pro_bet_temp[0]} = $pro_bet_temp[1];
  12. }
  13. close($protein_betweenness);
  14. #将邻接表存入一个二维数组。
  15. open(my $path_list,"Adjacency_List.txt")or die $!;
  16. while(my $path = <$path_list>){
  17.         chomp($path);
  18.         my @temp = split/\t/,$path;
  19.         my @add =[$temp[0],$temp[1]];
  20.         push @protein,@add;
  21. }
  22. close($path_list);
  23. #以seeds.txt中的数据作为起始点,开始查找通路。
  24. open(my $seeds_list,"seeds_list_test.txt")or die $!;
  25. open(OUTPUT,">>betweenness_path_list_3.txt")or die $!;
  26. while($seeds = <$seeds_list>){
  27.         chomp($seeds);
  28.         $j = 0;
  29.         @select_temp = ();
  30.         &find_next_protein($seeds);
  31.         for my $i(0 .. $#path){      #该for循环用于输出数组path
  32.                 print OUTPUT "$path[$i]\t";
  33.         }
  34.         print OUTPUT "\n";
  35.         @path = ();
  36. }
  37. close();
  38. #实现通路查找。
  39. sub find_next_protein{
  40.         if($j <= $#protein){
  41.                 if($protein[$j][0] eq $seeds){
  42.                         push @path,$seeds;
  43.                         &select_seeds_protein($protein[$j][1]);
  44.                         if($seeds){
  45.                                 $j = 0;
  46.                                 @select_temp = ();
  47.                                 &find_next_protein($seeds);
  48.                         }
  49.                 }else{
  50.                         $j++;
  51.                         &find_next_protein($seeds);
  52.                 }
  53.         }
  54. }
  55. #选择下一个节点。
  56. sub select_seeds_protein{
  57.         my %hash;
  58.         my @next_temp = split/ /,$protein[$j][1];
  59.         for(@next_temp){
  60.                 $hash{$_} = 1;
  61.         }
  62.         for(@path){
  63.                 $hash{$_} = 0;
  64.         }
  65.         for(sort keys %hash){
  66.                 if($hash{$_} ==1){
  67.                         push(@select_temp,$_);
  68.                 }
  69.         }
  70.         if(@select_temp){
  71.                 my $max_pro = &max(@select_temp);
  72.                 $seeds = $max_pro;
  73.         }else{
  74.                 $seeds = "";
  75.         }
  76. }
  77. #找出betweenness最大的邻居蛋白。
  78. sub max
  79. {
  80. $bigger =shift @_; #将数组中最左边的元素给$bigger;
  81. for (my $k = 0;$k <= $#_;$k++){
  82.                 if($protein_betweenness{$_[$k]} > $protein_betweenness{$bigger}){
  83.                         $bigger = $_[$k];
  84.                 }
  85.         }
  86.         $bigger;
  87. }
复制代码
但程序跑不到一行就报内存溢出~~(本人电脑是1G内存的)
有什么方法可以减少内存使用么?

数据.zip

334.23 KB, 下载次数: 16

论坛徽章:
0
2 [报告]
发表于 2011-09-29 17:23 |只看该作者
感觉是递归的逻辑出了问题

论坛徽章:
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
3 [报告]
发表于 2011-09-29 19:43 |只看该作者
你这个怎么保证避免几个点内转圈圈

论坛徽章:
0
4 [报告]
发表于 2011-09-29 19:44 |只看该作者
本帖最后由 arev326 于 2011-09-29 19:51 编辑

回复 2# iamlimeng


    之前写过一个程序,跟这个逻辑是一样的,不同之处在于选择下一个节点时是进行随机选择的,那个可以跑出结果来~~
所以,百思不得其解,搞不明白是什么地方出问题了~~

论坛徽章:
0
5 [报告]
发表于 2011-09-29 19:48 |只看该作者
回复 3# zhlong8


    select_seeds_protein子函数前面一部分就是将之前出现过的顶点剔除,也就是说 已经走过的点 不再重复走一遍~~

论坛徽章:
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
6 [报告]
发表于 2011-09-29 19:59 |只看该作者
回复  zhlong8


    select_seeds_protein子函数前面一部分就是将之前出现过的顶点剔除,也就是说 已经 ...
arev326 发表于 2011-09-29 19:48



    什么叫通路的终点?你用了很多全局变量看不太懂啊

论坛徽章:
0
7 [报告]
发表于 2011-09-29 20:40 |只看该作者
回复 6# zhlong8


    通路的终点也就是说这个点所有的邻居节点都已经被遍历过~~
   因为很多数据在子函数都要用到所以直接用了全局变量~~
  各位大牛,多多指正呀!!

论坛徽章:
0
8 [报告]
发表于 2011-09-30 08:25 |只看该作者
在递归中用了全局变量来计数,似乎就会变成没有终止条件的循环,最终系统资源耗尽,死机,我试了一下,不到一分钟就死机了。

你不妨在递归中加入一些中间值的屏幕输出,那样容易发现问题,以修正递归逻辑的错误。

@path其实没必要,可以直接在递归中找到一条就输出到文件,因为这个数组可能会无穷大(不知道你的数据量有多大),那会消耗掉全部内存。

论坛徽章:
0
9 [报告]
发表于 2011-09-30 08:51 |只看该作者
回复 8# iamlimeng


    好的,我去尝试一下~~
    用@path数组其实是为了方便select_seeds_protein子函数中剔除已遍历的顶点这个操作~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP