Chinaunix
标题:
求大神指导~~~一个小脚本 为什么运行的这么慢
[打印本页]
作者:
albertkingking
时间:
2014-02-20 14:31
标题:
求大神指导~~~一个小脚本 为什么运行的这么慢
写了一个很短的小脚本,处理序列比对结果用的,不知道为什么跑起来非常慢,输入的文本文件大概1G左右,跑了4个小时也没有出结果,求指导,万分感谢!!
脚本如下:
#!/usr/bin/perl -w
open IN, "<$ARGV[0]" or die "$!";
<IN>;
while(<IN>){
chomp;
@tmp=split(/\s+/,$_);
$va=$tmp[4]."\t".$tmp[0]."\t".$tmp[2];
if(!exists $hash{$tmp[3]}){
$hash{$tmp[3]}=$va;
}else{
$hash{$tmp[3]}=$hash{$tmp[3]}."\n".$va;
}
}
foreach $key(keys %hash){
print ">$key\n$hash{$key}\n";
}
输入文件格式如下:
trans_id trans_coord target_seq probe_id probe_seq num_mismatch strand
ch139708 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122612_h TTGCAGGAAAACAAGCTTAAGACGCCCAC 1 +
ch139708 294 TTGCAGGAAAACAAGCTTAACACGCCCACT n122613_h TTGCAGGAAAACAAGCTTAACATGCCCACT 1 +
ch139708 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122614_h TTGCAGGAAAACAAGCTTAACATGCCCAC 1 +
ch139708 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122615_h TTGCAGGAAAACAAGCTTAACACGCCCAC 0 +
ch321020 295 TTGCGGGAAAACAAGCTTAACACGCCCAC n122612_h TTGCAGGAAAACAAGCTTAAGACGCCCAC 2 +
ch321020 295 TTGCGGGAAAACAAGCTTAACACGCCCACT n122613_h TTGCAGGAAAACAAGCTTAACATGCCCACT 2 +
ch321020 295 TTGCGGGAAAACAAGCTTAACACGCCCAC n122614_h TTGCAGGAAAACAAGCTTAACATGCCCAC 2 +
ch321020 295 TTGCGGGAAAACAAGCTTAACACGCCCAC n122615_h TTGCAGGAAAACAAGCTTAACACGCCCAC 1 +
ch1324427 295 TTGCAGGAAAACAAGCTTAACACGCCCAC n122612_h TTGCAGGAAAACAAGCTTAAGACGCCCAC 1 +
ch1324427 295 TTGCAGGAAAACAAGCTTAACACGCCCACT n122613_h TTGCAGGAAAACAAGCTTAACATGCCCACT 1 +
ch1324427 295 TTGCAGGAAAACAAGCTTAACACGCCCAC n122614_h TTGCAGGAAAACAAGCTTAACATGCCCAC 1 +
ch1324427 295 TTGCAGGAAAACAAGCTTAACACGCCCAC n122615_h TTGCAGGAAAACAAGCTTAACACGCCCAC 0 +
ch665615 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122612_h TTGCAGGAAAACAAGCTTAAGACGCCCAC 1 +
ch665615 294 TTGCAGGAAAACAAGCTTAACACGCCCACT n122613_h TTGCAGGAAAACAAGCTTAACATGCCCACT 1 +
ch665615 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122614_h TTGCAGGAAAACAAGCTTAACATGCCCAC 1 +
ch665615 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122615_h TTGCAGGAAAACAAGCTTAACACGCCCAC 0 +
ch669024 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122612_h TTGCAGGAAAACAAGCTTAAGACGCCCAC 1 +
ch669024 294 TTGCAGGAAAACAAGCTTAACACGCCCACT n122613_h TTGCAGGAAAACAAGCTTAACATGCCCACT 1 +
ch669024 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122614_h TTGCAGGAAAACAAGCTTAACATGCCCAC 1 +
ch669024 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122615_h TTGCAGGAAAACAAGCTTAACACGCCCAC 0 +
ch672430 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122612_h TTGCAGGAAAACAAGCTTAAGACGCCCAC 1 +
ch672430 294 TTGCAGGAAAACAAGCTTAACACGCCCACT n122613_h TTGCAGGAAAACAAGCTTAACATGCCCACT 1 +
ch672430 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122614_h TTGCAGGAAAACAAGCTTAACATGCCCAC 1 +
ch672430 294 TTGCAGGAAAACAAGCTTAACACGCCCAC n122615_h TTGCAGGAAAACAAGCTTAACACGCCCAC 0 +
作者:
q1208c
时间:
2014-02-20 14:39
如果真用你这个脚本, 并且数据有4G的话, 你可能需要32G或更多的内存才能运行.
我猜你的机器正在拼命的 swap 吧?
作者:
vinian
时间:
2014-02-20 14:48
本帖最后由 vinian 于 2014-02-20 14:49 编辑
这个 $hash{$tmp[3]}. 会不会太长
然后打印出来很慢
用 哈希数组 试试
作者:
albertkingking
时间:
2014-02-20 14:51
机器内存有48G呢,但还是很慢,咋样能快些啊,我不懂为啥4G就得32G内存,我不是学计算机的,而且还是菜鸟,您能不能给我大概解释下,万分谢谢!
回复
2#
q1208c
作者:
albertkingking
时间:
2014-02-20 14:53
谢谢! 我看看咋写哈,还不会写数组的hash
回复
3#
vinian
作者:
vinian
时间:
2014-02-20 15:04
本帖最后由 vinian 于 2014-02-20 15:08 编辑
回复
5#
albertkingking
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, "<", "$ARGV[0]" or die "$!";
<$fh>;
my %hash;
while(<$fh>){
chomp;
my @tmp = split;
my $va = $tmp[4]."\t".$tmp[0]."\t".$tmp[2];
push @{$hash{$tmp[3]}}, $va;
}
foreach my $key (keys %hash){
print ">$key\n";
for my $item ( @{$hash{$key}} ) {
print "$item\n";
}
}
复制代码
作者:
albertkingking
时间:
2014-02-20 15:08
这么快就写好了,呃,太感谢了,我好好学习学习{:3_193:}
回复
6#
vinian
作者:
albertkingking
时间:
2014-02-20 15:14
还得再次感谢下,测试了一下,果然一会就出结果了,受教了,太谢谢了{:3_193:}
回复
6#
vinian
作者:
pitonas
时间:
2014-02-20 15:18
{:2_172:}
#!/usr/bin/perl
my %hash; <>;
while (<>) {
my @tmp = split /\s+/, $_, 6;
push @{ $hash{ $tmp[3] } }, "$tmp[4]\t$tmp[0]\t$tmp[2]\n";
}
foreach $key ( keys %hash ) {
print ">$key\n", @{ $hash{$key} };
}
复制代码
作者:
q1208c
时间:
2014-02-20 15:21
回复
4#
albertkingking
首先, 字符串方式的存储就会放大, 所以, 内存的总量一定大于4G, 然后, hash是每次申请的时候会double的, 所以, 会翻倍更快的.
所以, 你这4G的数据全导完, 估计得20G以上了. 保守点, 32G内存是靠谱的 .
作者:
albertkingking
时间:
2014-02-20 15:32
{:3_182:} 虽然看不太明白(计算机知识太差了),还是得谢谢谢谢,再谢谢,太感谢了{:3_200:}
回复
10#
q1208c
作者:
albertkingking
时间:
2014-02-20 15:33
{:2_172:} 太谢谢了 哈 万分感谢哈 ~~~~~~
回复
9#
pitonas
作者:
qq27898
时间:
2014-02-21 15:28
回复
4#
albertkingking
perl 的效率问题,存入内存的不止文本信息,还有其他信息以确保处理的速度
作者:
albertkingking
时间:
2014-03-04 11:19
{:2_172:} 谢谢~~还得多学习
回复
13#
qq27898
作者:
清泉一边
时间:
2014-04-17 21:48
my %hash;
while(<DATA>
{
chomp;
($ch,$n,$tar,$key,$pro)=split/\s+/;
$value="$pro"." "."$ch"." "."$tar";
# $hash{$key}=[] unless (exists $hash{$key});
push @{$hash{$key}},$value;
}
foreach $key(keys %hash)
{
print ">$key\n";
@value=(sort @{$hash{$key}});
print join "\n",@value;
print "\n";
回复
1#
albertkingking
作者:
sjdy521
时间:
2014-04-17 22:31
回复
10#
q1208c
换成push @{$hash{$tmp[3]}}, $va;不也一样有这些问题吗。。
作者:
kingfighters
时间:
2014-04-18 09:45
减少中间变量?或者是直接重用分割的结果?
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2