2009年9月26日星期六

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

2009/9/25 空格 <ribozyme2004@gmail.com>
程序里用的还是一个散列,如前面各位说的,它对内存的消耗非常大。目前看,计算12核苷酸(12bp)长度的串使用了2G左右的内存。计算10bp串使
用大约800M内存。我还没有算13bp的情况。truncatei 说的调整为整型的那个我还没有加上去。

这种容易组合爆炸的问题,最好还是不要用 Perl 了。。。Python/Ruby 应当也是类似的,呵呵。。。考虑到 Perl 散列底层的数据结构的实现,那个 RAM 占用太铺张了,哈哈!

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

2009/9/25 空格 <ribozyme2004@gmail.com>
好象确实是这个大文件支持没有打开。正在研究perl解释器中,呵呵。
另外,还有一个小建议,就是可不可以加一个参数。把这个寡核苷酸串的长度设定成按照用户需求设定的一个值。


你可以在 parse_seq_file 中利用 tokens_seen 这个变量作读取长度的限制 :) 当然,

            if (tokens_seen < APPEARS_SEQSIZE) {
                tokens_seen++;
            }

须替换为

            tokens_seen++;

即无条件递增。

由于总共不到 200 行 C++ 代码,而且我在可读性上面下了些功夫,应该不难修改和调试的,呵呵。

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

2009/9/24 agentzh <agentzh@gmail.com>
另一个值得一提的地方是,如果系统中使用的是带 pthread 支持的 glibc,则在 appears.cpp 中使用 getc_unlocked 代替 getc 可以观察到 70% 以上的总性能提升。我试了一下,处于 4 GB 文件的总用时从 7 分半下降到 2 分。

那天说错了,用时是从 7 分半钟下降到 4 分 :P

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

2009/9/25 空格 <ribozyme2004@gmail.com>
简单说,就是找到一个15bp串的时候,要同时把这个序列掉个,再按照AT互补GC互补的情况处理。生成的序列同样是应该考虑的一种情况。

这个可以在向 BitArray 注册序列时,把其"同构异形体也一并注册了 :) 在输出比特为 0 的对应序列的过程中,亦可将当前输出序列的同构异形体也在 BitArray 中注册为比特 1,这样后面就不会重复输出了。所以应当是加几行 C++ 代码的交情,哈哈!不知道我说的对不对?

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Jifty Model表示的语法是用的哪个模块?

2009/9/26 Beckheng Lam <bi.ken.lam@gmail.com>
是不是用了Moose的?
还是其它?


应当基于 Audrey 的 Object::Declare 吧?呵呵。我在 XUL::App 中也利用了这种语法糖。原本这次 BJPW 想在 DSL talk 中介绍这些东东的,但这个 talk 被 qiang 压到明年了。。。哈哈!

Cheers,
-agentzh


--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 版本perl 5.10语法特性请教!

perldoc feature

2009/9/26 <123456fuzhong@sohu.com>


Hi,all!

 

 

   最近小弟在用perl5.10版写脚本,很想了解其最新的语法特性,请问在perl哪个文档中可以了解到其详细用法及变更?小弟使用perl的时间不长,我看了一下perl 5。10自带的perl5100delta,上面只讲到有哪些更新,没有具体用法!哪位老大曾看过这个文档,望给点儿提示。




你的搜狐好友邀你领取“神秘礼包”
抽奖换礼,好运有你!



--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 使用perl -c能够检查对象调用的语法吗

找个好的编辑器,基本不会出现拼写错误的情况。

在2009-09-19,Troy <magicxiaowei@gmail.com> 写道:
>难道大家都没有被这个问题烦恼,有时候笔误写错了个字,结果要到运行时才发现这个错误,浪费了调试时间
>
>On 9月18日, 下午6时28分, Troy <magicxiao...@gmail.com> wrote:
>> 一个简单的对象方法调用如:$oo->do();有时会将方法名写错,这时尽管使用use strict和-w,也不能在perl -c的时候发现错误
>> ~~~
>>
>> 不知各位有没有好的方法可以检查这类错误~
>>
>> 谢谢:)


网易邮箱用户购物独享现金返还 --~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] 版本perl 5.10语法特性请教!


Hi,all!

 

 

   最近小弟在用perl5.10版写脚本,很想了解其最新的语法特性,请问在perl哪个文档中可以了解到其详细用法及变更?小弟使用perl的时间不长,我看了一下perl 5。10自带的perl5100delta,上面只讲到有哪些更新,没有具体用法!哪位老大曾看过这个文档,望给点儿提示。




--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Jifty Model表示的语法是用的哪个模块?

是不是用了Moose的?
还是其它?

--
Perl乐事 -- http://www.perlersh.org
我的博客 -- http://www.perlersh.org/blog.html


--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

那本书有电子版么,   发给我看好么
 


 
2009/9/26 空格 <ribozyme2004@gmail.com>
这个还真不知道。。。看Perl技术内幕上说的,each 的特点是能同时得到键和值,而keys函数只有一个模糊的评价:"很棒的"。。。


On 9月25日, 下午11时04分, Michael Zeng <galaxy2...@gmail.com> wrote:
> 书上说, hash大了,用each 来遍历,  即
> while ( ($key,$val) = each(%hash) ) {
>
> 是不是真的效率高很多? 要多大的hash 用each 才有效果?
>
>
> --
>            Yours Sincerely
>                    Zeng Hong

--
           Yours Sincerely
                   Zeng Hong

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 请问perl读文本文件,怎么样从末尾往前读?

和tee 类似啊,同步输出log  ,
 
open my $F1,     ' XXXcmd | " ;
 
while ( <$F1> )  {
     print  ;
}
 
 


 
2009/9/26 zheng wen <yzwen9999@gmail.com>
方法2没看懂。。

2009/9/23 Michael Zeng <galaxy2004@gmail.com>:
> 1用 File::ReadBackwards  :
> http://search.cpan.org/~uri/File-ReadBackwards-1.04/ReadBackwards.pm
>
> 2. 用管道:
>  open my $F1, " XXX cmd | " ;
> while (<$F1>) {
> ...
> }
> 该管道和命令输出是同步的,和 |tee类似
>
> 3。 seek +tell 也可以啊,自己可以控制
>
>
>
> 2009/9/23 msmouse <msmouse@gmail.com>
>>
>> 针对字节的就行呗,自己查换行
>>
>> 另外tac应该到处有吧?
>> ----------------------------------
>> msmouse@ir.hit.edu.cn
>> msmouse@gmail.com
>>
>>
>> 2009/9/23 zheng wen <yzwen9999@gmail.com>
>>>
>>> 现在处理一个log文件,想分析最近几分钟的log,现有以下方案:
>>> 1,用tail是可以的,但是不太好估计tail多少行,tail N行->判断->tail 2N行 貌似可以动态判断,但比较繁琐,个人不赞成
>>> 2,从前面正向读的话觉得读了前面一堆没有必要的行,文件大了会很慢,循环里面有一堆正则处理的东西
>>> 3,用tac file | 然后读管道,貌似比较不错,但不是很清楚所有server上是否都有tac命令,而且也不知道性能怎样?
>>> <4>,Perl里面从文件末尾开始向前读,不知道有没有简单的办法可以实现?seek tell的位置貌似都针对字节的。
>>>
>>> 针对4,有什么方法实现么?或者有没有其他的方案。简单有效的最好。
>>>
>>> 谢谢!
>>>
>>>
>>
>>
>>
>> --
>>            Yours Sincerely
>>                    Zeng Hong
>>
>> >>
>


--
           Yours Sincerely
                   Zeng Hong

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Merry Wedding to Qiang

恭喜恭喜恭喜
----- Original Message -----
From: joe jiang
Sent: Friday, September 25, 2009 4:34 PM
Subject: [PerlChina] Merry Wedding to Qiang

Dear qiang, I think it's very impossible that you can check mail at today(the day before wedding).

So I want to send my thanks to you, and show our appreciation to your works, which connects us (not only perl lovers, but also people seeks truth and wisdom). Wish you a great wedding :)
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

2009年9月25日星期五

[PerlChina] Re: 请问perl读文本文件,怎么样从末尾往前读?

方法2没看懂。。

2009/9/23 Michael Zeng <galaxy2004@gmail.com>:
> 1用 File::ReadBackwards :
> http://search.cpan.org/~uri/File-ReadBackwards-1.04/ReadBackwards.pm
>
> 2. 用管道:
> open my $F1, " XXX cmd | " ;
>  while (<$F1>) {
>     ...
>   }
> 该管道和命令输出是同步的,和 |tee类似
>
> 3。 seek +tell 也可以啊,自己可以控制
>
>
>
> 2009/9/23 msmouse <msmouse@gmail.com>
>>
>> 针对字节的就行呗,自己查换行
>>
>> 另外tac应该到处有吧?
>> ----------------------------------
>> msmouse@ir.hit.edu.cn
>> msmouse@gmail.com
>>
>>
>> 2009/9/23 zheng wen <yzwen9999@gmail.com>
>>>
>>> 现在处理一个log文件,想分析最近几分钟的log,现有以下方案:
>>> 1,用tail是可以的,但是不太好估计tail多少行,tail N行->判断->tail 2N行 貌似可以动态判断,但比较繁琐,个人不赞成
>>> 2,从前面正向读的话觉得读了前面一堆没有必要的行,文件大了会很慢,循环里面有一堆正则处理的东西
>>> 3,用tac file | 然后读管道,貌似比较不错,但不是很清楚所有server上是否都有tac命令,而且也不知道性能怎样?
>>> <4>,Perl里面从文件末尾开始向前读,不知道有没有简单的办法可以实现?seek tell的位置貌似都针对字节的。
>>>
>>> 针对4,有什么方法实现么?或者有没有其他的方案。简单有效的最好。
>>>
>>> 谢谢!
>>>
>>>
>>
>>
>>
>> --
>> Yours Sincerely
>> Zeng Hong
>>
>> >>
>

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

这个还真不知道。。。看Perl技术内幕上说的,each 的特点是能同时得到键和值,而keys函数只有一个模糊的评价:"很棒的"。。。


On 9月25日, 下午11时04分, Michael Zeng <galaxy2...@gmail.com> wrote:
> 书上说, hash大了,用each 来遍历, 即
> while ( ($key,$val) = each(%hash) ) {
>
> 是不是真的效率高很多? 要多大的hash 用each 才有效果?
>
>
> --
> Yours Sincerely
> Zeng Hong
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

更新了一下代码,使用OligoNuc.ctl保存相关配置内容。其格式如下:
# 寡核苷酸串长度
len of oligonuc string = 12

#来源文件目录
directory of genome sequences = /home/ribozyme/data/genomes/galga/

#是否遍历该目录
traversal the directory = N

遍历目录时所用的正则信息
key words of the files = _temp_\d+\.fsa

#不遍历目录时,给定的文件名
name of the files = Gallus_gallus.WASHUC2.55.dna_rm.chromosome.28.fa

#结果文件名称
result file name = /home/ribozyme/bin/ChrY/hash_12bp.dat

# Finish the ctrl file.


Perl程序文件中也做了修改,如下:

#!/usr/bin/perl -w
use warnings;
use strict;

my (@ctl,$len,$dir_a,$i,$file,@order,$m,%hash,@array,$temp,$line,@seq,
$seq,$str,@str,$index,$char,$n,$key,$val,$num);
open FA,q(/home/ribozyme/bin/ChrY/OligoNuc.ctl) or die "Can't find the
control file\n";
$i = 0;
while ( $line = <FA> ) {
next if $line=~m{^#};
$line =~ m{\s\=\s(.+)};
$ctl[$i]=$1;
$i++;
}
close FA;

$len = $ctl[0];
$dir_a = $ctl[1];
opendir DIR, $dir_a or die "Directory can't be opened!\n";
if ( $ctl[2] =~ m{^Y$}i ) {
$i = 0;
while ( $file = readdir(DIR) ) {
if ( $file =~ m{$ctl[3]} ) { $order[$i] = $dir_a.$file; $i++; }
}
} elsif ( $ctl[2] !~ m{^Y$}i ) {
$order[0] = $dir_a.$ctl[4];
}
close DIR;


my %code_of = (
A => 0,
G => 1,
C => 2,
T => 3
);
%hash = ();
$m = 0;
$i = 0;

foreach $file (@order) {
open FA,qq($file); # 打开基因组序列文件
$temp = '';
while ( $line = <FA> ) {
if ( $line =~ m{^>} ) { #如果是以大于号开头,则表示是fasta格式的序列标题行,用N代替之。一个文件中可能有多个
fasta格式的序列
$temp .= 'N';
} elsif ( $line !~ m{^>} ) { # 如果不是以大于号开头,则表示是真正的序列,其中包含大写的ATGCN五种字母。
chomp $line; # N表示测序不清楚,只能确定那里有一个核苷酸的位置。
$temp .= $line;
}
else {}
}
close FA;
print length($temp)." raw data obtained for $file.\n";

$i=0;
# 把所有连续的非N的长度在所要测的寡核苷酸串以上的序列都存入序列数组。
while ($temp=~m{([^N]{$len,})}g) { $seq[$i]=$1; $i++; }
print "$i sequences for the file...\n";

foreach $seq (@seq) {
$i = 0;
do {
$str[0] = uc( substr($seq,$i,$len) ); #从序列中截取一个短串
$str[1] = lc( reverse($str[0]) );
$str[1] =~ s{a}{T}g;
$str[1] =~ s{t}{A}g;
$str[1] =~ s{g}{C}g;
$str[1] =~ s{c}{G}g; #得到该短串的互补串,对于序列来说,其互补的结果也是要考虑的。
foreach $str (@str) {
# 计算一个15bp核苷酸串对应的下标,每个字符占用两个二进制位
my $index = 0;
for $char (split q[], $str) { # 按字符分开
$index = $index << 2; # 左移两位
$index += $code_of{$char}; # 将当前位加入末两位
}
if ( exists( $hash{$index} ) ) {
$hash{$index}++; # 如hash中有键值则计数
} else {
$hash{$index} = 1; # 如hash中没有则添加键值
$m++;
}
}
$i++;
} until ( length($seq) < $i + $len );
}
print qq($i 序列已处理,散列中有\t $m 个记录。\n);
}

#遍历散列并转换数字下标为核苷酸串
open FB,qq(>$ctl[5]);
$n=0;
while ( ($index,$val) = each(%hash) ) {
$str='';
$i=0;
do {
$num = $index & 2;
foreach $key ( keys %code_of ) {
if ( $code_of{$key} == $num ) {
$str .= $key;
}
}
$index = $index >> 2;
$i++;
} until ( $i == $len );
print FB qq($str\t$val\n);
$n++;
}
close FB;
print "There are totally $m kinds of oligonucs.\n";
print qq(Normal quit!\n);

On 9月25日, 下午1时56分, 空格 <ribozyme2...@gmail.com> wrote:
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Merry Wedding to Qiang

新来的,恭喜一下!

On 9月25日, 下午4时34分, joe jiang <lamp.p...@gmail.com> wrote:
> Dear qiang, I think it's very impossible that you can check mail at
> today(the day before wedding).
>
> So I want to send my thanks to you, and show our appreciation to your works,
> which connects us (not only perl lovers, but also people seeks truth and
> wisdom). Wish you a great wedding :)
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

Re: 答复: [PerlChina] Merry Wedding to Qiang

恭喜恭喜!!!

宇捷 wrote:

That's great! Cheers!

 

发件人: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] 代表 joe jiang
发送时间: 2009925 16:35
收件人: Qiang (James); perlchina
主题: [PerlChina] Merry Wedding to Qiang

 

Dear qiang, I think it's very impossible that you can check mail at today(the day before wedding).

So I want to send my thanks to you, and show our appreciation to your works, which connects us (not only perl lovers, but also people seeks truth and wisdom). Wish you a great wedding :)





--  Perl乐事 -- http://www.perlersh.org 我的博客 -- http://www.perlersh.org/blog.html 

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

书上说, hash大了,用each 来遍历,  即
while ( ($key,$val) = each(%hash) ) {
 
是不是真的效率高很多? 要多大的hash 用each 才有效果?
 
 


 
2009/9/25 空格 <ribozyme2004@gmail.com>
楼上的几位牛人说献丑是谦虚,我这里拿得出来的就真是“丑”了。
请各位高人指正。
按照目前的考虑,出现很少的次数(比如10次)和没有出现对后面的其他计算是一样的。所以这个程序仍然是计数的。另外,它可以按用户要求的长度计算寡核
苷酸串的出现频率。我正在用它算12个核苷酸的串的情况。
程序里用的还是一个散列,如前面各位说的,它对内存的消耗非常大。目前看,计算12核苷酸(12bp)长度的串使用了2G左右的内存。计算10bp串使
用大约800M内存。我还没有算13bp的情况。truncatei 说的调整为整型的那个我还没有加上去。

agentzh兄弟的那个appear.cpp程序里,有一点必须考虑的是寡核苷酸串的互补串的情况。这个说起来比较麻烦。
简单说,就是找到一个15bp串的时候,要同时把这个序列掉个,再按照AT互补GC互补的情况处理。生成的序列同样是应该考虑的一种情况。我最早说4G
的数据,其实一般的基因组都是2G多一点,就是因为考虑互补链才会加倍。



#!/usr/bin/perl -w
use warnings;
use strict;

my ($dir_a,$i,$file,@order,$m,%hash,@array,$temp,$line,@seq,$seq,
$str,@str,$index,$char,$n,$key,$val,$num);
print "Plz input the length of Oligonucleotide you want to count:";
my $len = <>;
chomp $len;

print "Input the file of genome sequence[G], or use default files
[D]...";
$i=<>;
chmop $i;
if ( $i eq 'D' ) {
#在缺省情况下,对某个目录中所有形如_temp_12.fa的文件进行计算。这是我把基因组文件切成50M左右的临时文件。
   $dir_a = "/home/ribozyme/data/genomes/panda/";
   opendir DIR, $dir_a or die;
   $i = 0;
   while ( $file = readdir(DIR) ) {
       if ( $file =~ m{_temp_\d+} ) {  $order[$i] = $dir_a.$file; $i++;  }
   }
   close DIR;
} elsif ( $i eq 'G' ) {
   $order[0]=$i;
} else {
   die "Plz input right choice.\n";
}

my %code_of = (
   A => 0,
   G => 1,
   C => 2,
   T => 3
   );
$m = 0;
$i = 0;

foreach $file (@order) {
   open FA,qq($file); # 打开基因组序列文件
   $temp = '';
   while ( $line = <FA> ) {

#如果是以大于号开头,则表示是fasta格式的序列标题行,用N代替之。一个文件中可能有多个fasta格式的序列
       if ( $line =~ m{^>} ) {
           $temp .= 'N';

# 如果不是以大于号开头,则表示是真正的序列,其中包含大写的ATGCN五种字母。
       } elsif ( $line !~ m{^>} ) {

# N表示测序不清楚,只能确定那里有一个核苷酸的位置。在基因组文件中很多的N ^_^
           chomp $line;
           $temp .= $line;
       }
       else {}
   }
   close FA;
   print length($temp)." raw data obtained for $file.\n";

   $i=0;
# 把所有连续的非N的长度在所要测的寡核苷酸串以上的序列都存入序列数组。
   while ($temp=~m{([^N]{$len,})}g) {  $seq[$i]=$1; $i++;  }
   print "$#seq sequences for the file...\n";

   foreach $seq (@seq) {
       $i = 0;
       do {
           $str[0] = uc( substr($seq,$i,$len) ); #从分段的基因组序列中截取一个短串
           $str[1] = lc( reverse($str[0]) );
           $str[1] =~ s{a}{T}g;
           $str[1] =~ s{t}{A}g;
           $str[1] =~ s{g}{C}g;
           $str[1] =~ s{c}{G}g;    #得到该短串的互补串。
           foreach $str (@str) {
# 计算一个15bp核苷酸串对应的下标,每个字符占用两个二进制位
               my $index = 0;
               for $char (split q[], $str) { # 按字符分开
                   $index = $index << 2; # 左移两位
                   $index += $code_of{$char}; # 将当前位加入末两位
               }
               if ( exists( $hash{$index} ) ) {
                   $hash{$index}++;  # 如hash中有键值则计数
               } else {
                   $hash{$index} = 1;  # 如hash中没有则添加键值
                   $m++;
               }
           }
           $i++;
       } until ( length($seq) < $i + $len );
   }
   print qq($i 序列已处理,散列中有\t $m 个记录。\n);
}

#遍历散列并转换数字下标为核苷酸串
$n=0;
while ( ($key,$val) = each(%hash) ) {
   $str='';
   do {
       $num = $key & 2;
       if ( $code_of{$char} == $char ) {
           $str .= $char;
       } else {
           print "impossible!!\n";
       }
       $key = $key >> 2;
   } until ( $key == 0 );
   print qq($str\t$val\n);
   $n++;
}
print "There are totally $m kinds of oligonucs.\n";
print qq(Normal quit!\n);




--
           Yours Sincerely
                   Zeng Hong

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

答复: [PerlChina] Merry Wedding to Qiang

That's great! Cheers!

 

发件人: perlchina@googlegroups.com [mailto:perlchina@googlegroups.com] 代表 joe jiang
发送时间: 2009925 16:35
收件人: Qiang (James); perlchina
主题: [PerlChina] Merry Wedding to Qiang

 

Dear qiang, I think it's very impossible that you can check mail at today(the day before wedding).

So I want to send my thanks to you, and show our appreciation to your works, which connects us (not only perl lovers, but also people seeks truth and wisdom). Wish you a great wedding :)


--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] 一个奇怪的问题关于switch和formline

个奇怪的问题。
perl -e "do q/test\/testSql\/TESTSQL.pm/ or print qq/Can't do:$!/;"
testsql.pm在test/testSql下面
testsql.pm里面有switch的时候就会显示
Can't do:Bad file descriptor
 
不是use Switch;的时候
是使用switch的时候。
后来看了看一旦使用switch。这时候formline的here doc就会报错显示找不到结束串。
但实际上结束串有。
后来我将结束串后面的语句放到do{}里面,就不会出错,不知道为什么。here doc对结束串以后的语句还有要求?还是仅仅是因为formline的问题
举个简单的例子
sub createConn{
 my ($testConn)=@_;
 switch ($testConn){
 }
}
sub test{
 formline <<End;
 test
End
 do{
  $i=$i+1;
 }
}
1;
这时候使用
perl -e "do q/test\/testSql\/test.pm/ or print qq/Can't do:$!/;"不会报错
 
sub createConn{
 my ($testConn)=@_;
 switch ($testConn){
 }
}
sub test{
 my $i=1;
 formline <<End;
 test
End
  $i=$i+1;
}
1;
这个时候
perl -e "do q/test\/testSql\/test.pm/ or print qq/Can't do:$!/;"会报错
Can't do:Bad file descriptor

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] 起怪的问题关于switch和formline

一个奇怪的问题。
perl -e "do q/test\/testSql\/TESTSQL.pm/ or print qq/Can't do:$!/;"
testsql.pm在test/testSql下面
testsql.pm里面有switch的时候就会显示
Can't do:Bad file descriptor
 
不是use Switch;的时候
是使用switch的时候。
后来看了看一旦使用switch。这时候formline的here doc就会报错显示找不到结束串。
但实际上结束串有。
后来我将结束串后面的语句放到do{}里面,就不会出错,不知道为什么。here doc对结束串以后的语句还有要求?还是仅仅是因为formline的问题
举个简单的例子
sub createConn{
 my ($testConn)=@_;
 switch ($testConn){
 }
}
sub test{
 formline <<End;
 test
End
 do{
  $i=$i+1;
 }
}
1;
这时候使用
perl -e "do q/test\/testSql\/test.pm/ or print qq/Can't do:$!/;"不会报错
 
sub createConn{
 my ($testConn)=@_;
 switch ($testConn){
 }
}
sub test{
 my $i=1;
 formline <<End;
 test
End
  $i=$i+1;
}
1;
这个时候
perl -e "do q/test\/testSql\/test.pm/ or print qq/Can't do:$!/;"会报错
Can't do:Bad file descriptor
 
 


 


 

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Merry Wedding to Qiang

向 qiang 证实这点的时候吓一跳,速度真快!
恭喜~

On Fri, Sep 25, 2009 at 5:17 PM, Yuan Jiang <sleetdrop@gmail.com> wrote:
祝贺一下。
Qiang可是个大帅哥,哪个MM这么好运气把他弄到手了啊!

On Fri, Sep 25, 2009 at 4:52 PM, xjdengz <xjdengz@gmail.com> wrote:
Congratulations!
On Fri, Sep 25, 2009 at 04:34:47PM +0800, joe jiang wrote:
>Dear qiang, I think it's very impossible that you can check mail at
>today(the day before wedding).
>
>So I want to send my thanks to you, and show our appreciation to your works,
>which connects us (not only perl lovers, but also people seeks truth and
>wisdom). Wish you a great wedding :)
>
>>





--
姜源
Yuan Jiang
http://blog.vetcafe.net
http://twitter.com/sleetdrop






--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Merry Wedding to Qiang

祝贺一下。
Qiang可是个大帅哥,哪个MM这么好运气把他弄到手了啊!

On Fri, Sep 25, 2009 at 4:52 PM, xjdengz <xjdengz@gmail.com> wrote:
Congratulations!
On Fri, Sep 25, 2009 at 04:34:47PM +0800, joe jiang wrote:
>Dear qiang, I think it's very impossible that you can check mail at
>today(the day before wedding).
>
>So I want to send my thanks to you, and show our appreciation to your works,
>which connects us (not only perl lovers, but also people seeks truth and
>wisdom). Wish you a great wedding :)
>
>>





--
姜源
Yuan Jiang
http://blog.vetcafe.net
http://twitter.com/sleetdrop


--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Merry Wedding to Qiang

Congratulations!

2009/9/25 joe jiang <lamp.purl@gmail.com>
Dear qiang, I think it's very impossible that you can check mail at today(the day before wedding).

So I want to send my thanks to you, and show our appreciation to your works, which connects us (not only perl lovers, but also people seeks truth and wisdom). Wish you a great wedding :)





--
  此致,
敬礼!

黄浩
国家高性能计算机工程技术研究中心
中国科学院计算技术研究所
工作电话:01062600552
Email:huanghao@nrchpc.ac.cn




--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Merry Wedding to Qiang

恭喜
----------------------------------
msmouse@ir.hit.edu.cn
msmouse@gmail.com


2009/9/25 joe jiang <lamp.purl@gmail.com>
Dear qiang, I think it's very impossible that you can check mail at today(the day before wedding).

So I want to send my thanks to you, and show our appreciation to your works, which connects us (not only perl lovers, but also people seeks truth and wisdom). Wish you a great wedding :)




--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Merry Wedding to Qiang

Congratulations!
On Fri, Sep 25, 2009 at 04:34:47PM +0800, joe jiang wrote:
>Dear qiang, I think it's very impossible that you can check mail at
>today(the day before wedding).
>
>So I want to send my thanks to you, and show our appreciation to your works,
>which connects us (not only perl lovers, but also people seeks truth and
>wisdom). Wish you a great wedding :)
>
>>

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: Merry Wedding to Qiang

Woo! congrats!

joe jiang wrote:
> Dear qiang, I think it's very impossible that you can check mail at
> today(the day before wedding).
>
> So I want to send my thanks to you, and show our appreciation to your
> works, which connects us (not only perl lovers, but also people seeks
> truth and wisdom). Wish you a great wedding :)
>
> >


--
Fayland Lam // http://www.fayland.org/


--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Merry Wedding to Qiang

Dear qiang, I think it's very impossible that you can check mail at today(the day before wedding).

So I want to send my thanks to you, and show our appreciation to your works, which connects us (not only perl lovers, but also people seeks truth and wisdom). Wish you a great wedding :)

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

2009年9月24日星期四

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

楼上的几位牛人说献丑是谦虚,我这里拿得出来的就真是"丑"了。
请各位高人指正。
按照目前的考虑,出现很少的次数(比如10次)和没有出现对后面的其他计算是一样的。所以这个程序仍然是计数的。另外,它可以按用户要求的长度计算寡核
苷酸串的出现频率。我正在用它算12个核苷酸的串的情况。
程序里用的还是一个散列,如前面各位说的,它对内存的消耗非常大。目前看,计算12核苷酸(12bp)长度的串使用了2G左右的内存。计算10bp串使
用大约800M内存。我还没有算13bp的情况。truncatei 说的调整为整型的那个我还没有加上去。

agentzh兄弟的那个appear.cpp程序里,有一点必须考虑的是寡核苷酸串的互补串的情况。这个说起来比较麻烦。
简单说,就是找到一个15bp串的时候,要同时把这个序列掉个,再按照AT互补GC互补的情况处理。生成的序列同样是应该考虑的一种情况。我最早说4G
的数据,其实一般的基因组都是2G多一点,就是因为考虑互补链才会加倍。

#!/usr/bin/perl -w
use warnings;
use strict;

my ($dir_a,$i,$file,@order,$m,%hash,@array,$temp,$line,@seq,$seq,
$str,@str,$index,$char,$n,$key,$val,$num);
print "Plz input the length of Oligonucleotide you want to count:";
my $len = <>;
chomp $len;

print "Input the file of genome sequence[G], or use default files
[D]...";
$i=<>;
chmop $i;
if ( $i eq 'D' ) {
#在缺省情况下,对某个目录中所有形如_temp_12.fa的文件进行计算。这是我把基因组文件切成50M左右的临时文件。
$dir_a = "/home/ribozyme/data/genomes/panda/";
opendir DIR, $dir_a or die;
$i = 0;
while ( $file = readdir(DIR) ) {
if ( $file =~ m{_temp_\d+} ) { $order[$i] = $dir_a.$file; $i++; }
}
close DIR;
} elsif ( $i eq 'G' ) {
$order[0]=$i;
} else {
die "Plz input right choice.\n";
}

my %code_of = (
A => 0,
G => 1,
C => 2,
T => 3
);
$m = 0;
$i = 0;

foreach $file (@order) {
open FA,qq($file); # 打开基因组序列文件
$temp = '';
while ( $line = <FA> ) {

#如果是以大于号开头,则表示是fasta格式的序列标题行,用N代替之。一个文件中可能有多个fasta格式的序列
if ( $line =~ m{^>} ) {
$temp .= 'N';

# 如果不是以大于号开头,则表示是真正的序列,其中包含大写的ATGCN五种字母。
} elsif ( $line !~ m{^>} ) {

# N表示测序不清楚,只能确定那里有一个核苷酸的位置。在基因组文件中很多的N ^_^
chomp $line;
$temp .= $line;
}
else {}
}
close FA;
print length($temp)." raw data obtained for $file.\n";

$i=0;
# 把所有连续的非N的长度在所要测的寡核苷酸串以上的序列都存入序列数组。
while ($temp=~m{([^N]{$len,})}g) { $seq[$i]=$1; $i++; }
print "$#seq sequences for the file...\n";

foreach $seq (@seq) {
$i = 0;
do {
$str[0] = uc( substr($seq,$i,$len) ); #从分段的基因组序列中截取一个短串
$str[1] = lc( reverse($str[0]) );
$str[1] =~ s{a}{T}g;
$str[1] =~ s{t}{A}g;
$str[1] =~ s{g}{C}g;
$str[1] =~ s{c}{G}g; #得到该短串的互补串。
foreach $str (@str) {
# 计算一个15bp核苷酸串对应的下标,每个字符占用两个二进制位
my $index = 0;
for $char (split q[], $str) { # 按字符分开
$index = $index << 2; # 左移两位
$index += $code_of{$char}; # 将当前位加入末两位
}
if ( exists( $hash{$index} ) ) {
$hash{$index}++; # 如hash中有键值则计数
} else {
$hash{$index} = 1; # 如hash中没有则添加键值
$m++;
}
}
$i++;
} until ( length($seq) < $i + $len );
}
print qq($i 序列已处理,散列中有\t $m 个记录。\n);
}

#遍历散列并转换数字下标为核苷酸串
$n=0;
while ( ($key,$val) = each(%hash) ) {
$str='';
do {
$num = $key & 2;
if ( $code_of{$char} == $char ) {
$str .= $char;
} else {
print "impossible!!\n";
}
$key = $key >> 2;
} until ( $key == 0 );
print qq($str\t$val\n);
$n++;
}
print "There are totally $m kinds of oligonucs.\n";
print qq(Normal quit!\n);

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

好象确实是这个大文件支持没有打开。正在研究perl解释器中,呵呵。
另外,还有一个小建议,就是可不可以加一个参数。把这个寡核苷酸串的长度设定成按照用户需求设定的一个值。

On 9月24日, 下午4时51分, agentzh <agen...@gmail.com> wrote:
> 2009/9/24 空格 <ribozyme2...@gmail.com>
>
> > 一个问题,请问您是怎样打开一个大文件的。我打开一个2.4G大小的基因组文件会报错:
> > panic: realloc at ChrY-0.2-bit.pl line 23, <FA> line 42954286.
> > 好象是什么"堆溢出的恐慌"。。。怎么会这样呢?
> > //bow
>
> 你使用的 perl 5 解释器在编译时启用了 large file 支持了么?呵呵。
>
> Cheers,
> -agentzh
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

2009/9/24 空格 <ribozyme2004@gmail.com>
一个问题,请问您是怎样打开一个大文件的。我打开一个2.4G大小的基因组文件会报错:
panic: realloc at ChrY-0.2-bit.pl line 23, <FA> line 42954286.
好象是什么"堆溢出的恐慌"。。。怎么会这样呢?
//bow


你使用的 perl 5 解释器在编译时启用了 large file 支持了么?呵呵。

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

2009/9/24 空格 <ribozyme2004@gmail.com>
另外,提几个小建议。一个是自动删除序列中以大于号开头的行。因为基因组序列保存一般都是fasta格式。就是第一行用一个大于号开头,后面是这个序列
的标题。下面才是序列的内容。另外一个建议就是真实的测序文件中会有N出现。这表示测序结果不确定的情况。在处理序列时可以把N分隔的序列逐段保存成一
个字符数组再逐个计数。


欢迎提供补丁和测试用例 :) 我需要分配更多的时间给 $work 中的需求了,呵呵。。。

另一个值得一提的地方是,如果系统中使用的是带 pthread 支持的 glibc,则在 appears.cpp 中使用 getc_unlocked 代替 getc 可以观察到 70% 以上的总性能提升。我试了一下,处于 4 GB 文件的总用时从 7 分半下降到 2 分。对 t/gensample.c 施用类似的 s/putc/putc_unlocked/ 亦会看到近 70% 的提速。回头得空了,我再加一下 autoconf/automake 支持,以便能自动检测系统中是否有 *_unlocked 函数,呵呵。。。

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

另外,提几个小建议。一个是自动删除序列中以大于号开头的行。因为基因组序列保存一般都是fasta格式。就是第一行用一个大于号开头,后面是这个序列
的标题。下面才是序列的内容。另外一个建议就是真实的测序文件中会有N出现。这表示测序结果不确定的情况。在处理序列时可以把N分隔的序列逐段保存成一
个字符数组再逐个计数。


On 9月24日, 上午11时02分, agentzh <agen...@gmail.com> wrote:
> 2009/9/23 空格 <ribozyme2...@gmail.com>
>
> > 从一个基因组中取了50M大小的一段序列测试了一下,比较成功。top显示的结果如下:
>
> Yay! 我刚刚又对 appears 进行了一些改进,现发布 v0.02:
>
> http://github.com/agentzh/appears/downloads
>
> 主要改动如下:
>
> 1. 代码命名调整:使用 token 来表示核苷,而非有歧议的 char 这个术语
> 2. 在代码中进一步去除"神秘的数"
> 3. 按 gcc 要求启用 large file 支持(原先的 v0.01 在 Linux 上读取 4 GB 的文件会报错: "Value too
> large for defined data type")
> 4. 添加了 t/gensample.pl 和 t/gensample.c 这两个程序,用来生成指定大小的随机序列文件(默认为 4.8 G)。
>
> gensample.pl 和 gensample.c 的功能相同,但性能有明显差别:Perl 实现大约 1 秒生成 1 MB 的序列,而后者,即 C
> 实现, 1 秒大约生成 20 MB 的序列。
>
> 我使用 gensample.c 程序生成了一个 4 GB 大小的随机序列文件,其输出如下:
>
> $ time t/gensample > samples/big.txt
> real 2m25.392s
> user 2m11.432s
> sys 0m6.148s
>
> $ ls -lh samples/big.txt
> -rw-r--r-- 1 agentz agentz 4.0G 2009-09-24 10:20 samples/big.txt
>
> $ time ./appears samples/big.txt > /tmp/out.txt
> INFO: Reading file samples/big.txt...
> INFO: Using a bit array of length 1073741824 (sequence length: 15).
> INFO: Searching missing combinations of sequences...
>
> real 7m36.456s
> user 6m59.882s
> sys 0m9.977s
>
> 在我的 Core2Duo T9600, SATA 7600rpm disk 的本本上,*一共只需要 7 分半钟*的时间,呵呵。
>
> 可以看到,appears占用了2G的内存的6.5%,正好是大约130M。和几位大大估算的非常一致。因为程序是把结果打印到屏幕的,所以> konsle有占用很多的cpu资源。
>
> 结果最好重定向到磁盘文件,就像上面所演示的那样,呵呵。
>
> Cheers,
> -agentzh
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

一个问题,请问您是怎样打开一个大文件的。我打开一个2.4G大小的基因组文件会报错:
panic: realloc at ChrY-0.2-bit.pl line 23, <FA> line 42954286.
好象是什么"堆溢出的恐慌"。。。怎么会这样呢?
//bow

On 9月24日, 上午11时02分, agentzh <agen...@gmail.com> wrote:
> 2009/9/23 空格 <ribozyme2...@gmail.com>
>
> > 从一个基因组中取了50M大小的一段序列测试了一下,比较成功。top显示的结果如下:
>
> Yay! 我刚刚又对 appears 进行了一些改进,现发布 v0.02:
>
> http://github.com/agentzh/appears/downloads
>
> 主要改动如下:
>
> 1. 代码命名调整:使用 token 来表示核苷,而非有歧议的 char 这个术语
> 2. 在代码中进一步去除"神秘的数"
> 3. 按 gcc 要求启用 large file 支持(原先的 v0.01 在 Linux 上读取 4 GB 的文件会报错: "Value too
> large for defined data type")
> 4. 添加了 t/gensample.pl 和 t/gensample.c 这两个程序,用来生成指定大小的随机序列文件(默认为 4.8 G)。
>
> gensample.pl 和 gensample.c 的功能相同,但性能有明显差别:Perl 实现大约 1 秒生成 1 MB 的序列,而后者,即 C
> 实现, 1 秒大约生成 20 MB 的序列。
>
> 我使用 gensample.c 程序生成了一个 4 GB 大小的随机序列文件,其输出如下:
>
> $ time t/gensample > samples/big.txt
> real 2m25.392s
> user 2m11.432s
> sys 0m6.148s
>
> $ ls -lh samples/big.txt
> -rw-r--r-- 1 agentz agentz 4.0G 2009-09-24 10:20 samples/big.txt
>
> $ time ./appears samples/big.txt > /tmp/out.txt
> INFO: Reading file samples/big.txt...
> INFO: Using a bit array of length 1073741824 (sequence length: 15).
> INFO: Searching missing combinations of sequences...
>
> real 7m36.456s
> user 6m59.882s
> sys 0m9.977s
>
> 在我的 Core2Duo T9600, SATA 7600rpm disk 的本本上,*一共只需要 7 分半钟*的时间,呵呵。
>
> 可以看到,appears占用了2G的内存的6.5%,正好是大约130M。和几位大大估算的非常一致。因为程序是把结果打印到屏幕的,所以> konsle有占用很多的cpu资源。
>
> 结果最好重定向到磁盘文件,就像上面所演示的那样,呵呵。
>
> Cheers,
> -agentzh
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

基因组序列可以在网上下载到。比如这里这个网址可以下载人的全部基因组序列:
ftp://ftp.ensembl.org/pub/release-55/fasta/homo_sapiens/dna/Homo_sapiens.GRCh37.55.dna.toplevel.fa.gz
下载速度还是蛮快的。^_^

On 9月24日, 上午11时02分, agentzh <agen...@gmail.com> wrote:
> Yay! 我刚刚又对 appears 进行了一些改进,现发布 v0.02:
>
> http://github.com/agentzh/appears/downloads
>
> 主要改动如下:
>
> 1. 代码命名调整:使用 token 来表示核苷,而非有歧议的 char 这个术语
> 2. 在代码中进一步去除"神秘的数"
> 3. 按 gcc 要求启用 large file 支持(原先的 v0.01 在 Linux 上读取 4 GB 的文件会报错: "Value too
> large for defined data type")
> 4. 添加了 t/gensample.pl 和 t/gensample.c 这两个程序,用来生成指定大小的随机序列文件(默认为 4.8 G)。
>
> gensample.pl 和 gensample.c 的功能相同,但性能有明显差别:Perl 实现大约 1 秒生成 1 MB 的序列,而后者,即 C
> 实现, 1 秒大约生成 20 MB 的序列。
>
> 我使用 gensample.c 程序生成了一个 4 GB 大小的随机序列文件,其输出如下:
>
> $ time t/gensample > samples/big.txt
> real 2m25.392s
> user 2m11.432s
> sys 0m6.148s
>
> $ ls -lh samples/big.txt
> -rw-r--r-- 1 agentz agentz 4.0G 2009-09-24 10:20 samples/big.txt
>
> $ time ./appears samples/big.txt > /tmp/out.txt
> INFO: Reading file samples/big.txt...
> INFO: Using a bit array of length 1073741824 (sequence length: 15).
> INFO: Searching missing combinations of sequences...
>
> real 7m36.456s
> user 6m59.882s
> sys 0m9.977s
>
> 在我的 Core2Duo T9600, SATA 7600rpm disk 的本本上,*一共只需要 7 分半钟*的时间,呵呵。
>
> 结果最好重定向到磁盘文件,就像上面所演示的那样,呵呵。
>
> Cheers,
> -agentzh
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

2009年9月23日星期三

[PerlChina] Re: Perl script调用.exe工具的问题。

2009/9/23 TBY <tangboyun@hotmail.com>

我的想法是把注释 划X的地方去掉,然后直接在那里传递一个字符串变量

然后问题出现在,我没有办法再去格式化这个字串,fscanf的功能,我翻了一下午C++资料,找不到可以替代掉的办法,理论上应该可以用sscanf
去格式化字串后,把它导入x,但是总不成功。

呃。。。自己用指针写一个简单的解析器吧,呵呵,把 atoi, atof 啥的也用上。当然,也可以利用 Ragel 这个工具自动生成状态机代码:

  http://www.complang.org/ragel/

有趣的是,这个东东我还是在学习 Nginx 教程的过程中发现的,呵呵。(当然,使用 pcre 这个库也挺好的,就是运行时性能不及 Ragel 生成的代码好。

这个有些纯 C/C++ 主题了,OT 了,OT 了 :P

Cheers,
-agentzh


--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?


还是perl 社区的牛人多,那个C++实现太赞了。
我前两周的时候,也是正好遇到一个做生物的朋友提这个问题,所以写了一个基于Postgres的数据库bimap映射实现,还很简陋,正在整理资料。

数据结构很简单:

create table bitmap(bigint idx, segment bit(32));

其它计算方面的东西相信就都很好写了,这里我献丑放一个记录覆盖的:

create or replace function segment_true(s bigint, e bigint) returns void as $$
declare
    sidx bigint;
    eidx bigint;
    d_data bit(32) := 4294967295::bit(32); -- pow(2, 32) -1
begin
    if currval('bitmap_idx_seq') < (e/32)+1 then
        for i in currval('bitmap_idx_seq')..e/32+1 loop
            insert into bitmap(segment) select 0::bit(32);
        end loop;
    end if;
    sidx := s/32;
    eidx := e/32;
    if sidx = eidx then
        update bitmap set segment = (d_data << cast((32-e%32) as int))&(d_data >> cast((s%32) as int)) where idx = sidx;
    else
        update bitmap set segment = segment | (d_data >> cast((s%32) as int)) where idx = sidx;
        update bitmap set segment = d_data where sidx < idx and idx < eidx;
        update bitmap set segment = segment | (d_data << cast((e%32) AS INT)) where idx = eidx;
    end if;
end;
$$ language plpgsql;

说明一下,PG的整数没有无符号类型,所以操作起来比较讨厌,我干脆直接用它的bit类型,这个类型最多可以支持2^31位,所有基础的位运算它都支持。通过idx可以将分片的bit记录连成一个大的bitmap。具体bit应该多少位,idx应该用int还是bigint,我想应该视数据量和业务来调整,不必太死板,能达到好用,快速就好。

数据库实现的好处是可以在数据量和性能以及并发性上有个比较折中的实现,而且因为都是现成的功能,组合起来比较快,质量也可靠。

空格兄的问题很有意思,我想写写试试。

--
光见贼吃肉,没见贼挨打。
……

劉鑫
March.Liu

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

2009/9/23 truncatei <truncatei@gmail.com>
真的猜对了
一个ASCII字符一般是一byte是占用8个bit (二进制)
agent大侠的算法应该是用位实现的(我今天没时间down下来研究)


嗯,都是位运算,代码就一个 .cpp 文件,一眼就看到底了,呵呵:

   http://github.com/agentzh/appears/blob/master/appears.cpp

真的要感谢 DNA/RNA 世界是“四进制”的,于是可以很容易地和计算机的二进制系统对齐(毕竟是 2 的幂),这给核苷 GATC 到二进制比特的正反向编码映射,带来了极大的便利。如果遗传物质是“三进制”的话,appears.cpp 真的会复杂许多,呵呵。

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

2009/9/23 空格 <ribozyme2004@gmail.com>
从一个基因组中取了50M大小的一段序列测试了一下,比较成功。top显示的结果如下:


Yay! 我刚刚又对 appears 进行了一些改进,现发布 v0.02:

  http://github.com/agentzh/appears/downloads

主要改动如下:

1. 代码命名调整:使用 token 来表示核苷,而非有歧议的 char 这个术语
2. 在代码中进一步去除“神秘的数”
3. 按 gcc 要求启用 large file 支持(原先的 v0.01 在 Linux 上读取 4 GB 的文件会报错: "Value too large for defined data type")
4. 添加了 t/gensample.pl 和 t/gensample.c 这两个程序,用来生成指定大小的随机序列文件(默认为 4.8 G)。

gensample.pl 和 gensample.c 的功能相同,但性能有明显差别:Perl 实现大约 1 秒生成 1 MB 的序列,而后者,即 C 实现, 1 秒大约生成 20 MB 的序列。

我使用 gensample.c 程序生成了一个 4 GB 大小的随机序列文件,其输出如下:

    $ time t/gensample > samples/big.txt
    real    2m25.392s
    user    2m11.432s
    sys    0m6.148s

    $ ls -lh samples/big.txt
    -rw-r--r-- 1 agentz agentz 4.0G 2009-09-24 10:20 samples/big.txt

    $ time ./appears samples/big.txt > /tmp/out.txt
    INFO: Reading file samples/big.txt...
    INFO: Using a bit array of length 1073741824 (sequence length: 15).
    INFO: Searching missing combinations of sequences...

    real    7m36.456s
    user    6m59.882s
    sys    0m9.977s

在我的 Core2Duo T9600, SATA 7600rpm disk 的本本上,一共只需要 7 分半钟的时间,呵呵。

可以看到,appears占用了2G的内存的6.5%,正好是大约130M。和几位大大估算的非常一致。因为程序是把结果打印到屏幕的,所以
konsle有占用很多的cpu资源。


结果最好重定向到磁盘文件,就像上面所演示的那样,呵呵。

Cheers,
-agentzh

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

在perl里可以用 use integer把上下文的数字调整为整型的

2009/9/23 空格 <ribozyme2004@gmail.com>
好吧,抱歉我以为看懂了原来还是没明白...  :P
我之前一直想的是数字,而不是数位。
尤其这句:
$index *= 4; # 左移两位

希望我这次是真明白点了。。。 //blush...

On 9月23日, 下午9时50分, msmouse <msmo...@gmail.com> wrote:
> 不是32位是30位,,写顺手了。。
> ----------------------------------
> msmo...@ir.hit.edu.cn
> msmo...@gmail.com
>
> 2009/9/23 msmouse <msmo...@gmail.com>
>
> > 不是15位十进制数,是32位二进制 只是我没把1234写成 0b00 0b01 0b10 0b11,没把$index*4写成$index<<2而已。。
> > ----------------------------------


--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

好吧,抱歉我以为看懂了原来还是没明白... :P
我之前一直想的是数字,而不是数位。
尤其这句:
$index *= 4; # 左移两位

希望我这次是真明白点了。。。 //blush...

On 9月23日, 下午9时50分, msmouse <msmo...@gmail.com> wrote:
> 不是32位是30位,,写顺手了。。
> ----------------------------------
> msmo...@ir.hit.edu.cn
> msmo...@gmail.com
>
> 2009/9/23 msmouse <msmo...@gmail.com>
>
> > 不是15位十进制数,是32位二进制 只是我没把1234写成 0b00 0b01 0b10 0b11,没把$index*4写成$index<<2而已。。
> > ----------------------------------
> > msmo...@ir.hit.edu.cn
> > msmo...@gmail.com
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

从一个基因组中取了50M大小的一段序列测试了一下,比较成功。top显示的结果如下:

op - 22:26:25 up 13:09, 1 user, load average: 1.20, 1.03, 0.86
Tasks: 144 total, 2 running, 142 sleeping, 0 stopped, 0 zombie
Cpu(s): 47.2% us, 3.2% sy, 0.0% ni, 49.7% id, 0.0% wa, 0.0% hi,
0.0% si
Mem: 2019000k total, 705476k used, 1313524k free, 13848k
buffers
Swap: 20972816k total, 429208k used, 20543608k free, 270020k
cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10886 ribozyme 20 0 57716 7092 4464 R 93 0.4 7:06.10 konsole
23717 ribozyme 20 0 130m 128m 676 S 7 6.5 0:40.05 appears
3509 ribozyme 20 0 410m 86m 18m S 1 4.4 59:36.64 firefox
2275 root 20 0 399m 31m 5948 S 1 1.6 17:12.06 X

可以看到,appears占用了2G的内存的6.5%,正好是大约130M。和几位大大估算的非常一致。因为程序是把结果打印到屏幕的,所以
konsle有占用很多的cpu资源。


On 9月23日, 下午6时04分, agentzh <agen...@gmail.com> wrote:
> 2009/9/23 agentzh <agen...@gmail.com>:
>
>
>
> > 今天晚些时候,我会提供一个 C++ 实现 ;)
>
> 刚刚写了一个 ANSI C++ 实现,呵呵,也不过 *180 行代码*,在 Linux 和 Win32 上进行了简单的测试。代码我作为 appears
> 项目放在了 GitHub 上面:
>
> http://github.com/agentzh/appears
>
> 如果没有 git 或者不熟悉 git,可以直接从下面的页面下载 v0.01 版的压缩包:
>
> http://github.com/agentzh/appears/downloads
>
> 解压后的编译和用法见 README 和 Makefile.
>
> 简单说来,在 Win32 上使用
>
> nmake -f NMakefile
>
> 来编译。然后用命令
>
> appears.exe input.txt
>
> 来分析输入文件 input.txt
>
> 在 Linux 上则直接
>
> make
>
> 程序用法是
>
> ./appears input.txt
>
> 为了测试方便,上面的项目构造过程还会生成 appears1 和 appears2 这两个程序,分别对应序列长度为 1 和 2 的情形(默认的
> appears 对应 15)。
>
> 仅进行了简单的测试,欢迎同学们提供更彻底的基于 Perl 的测试集,哈哈!
>
> 在 Linux 利用 pmap 检查 appears 程序的内存占用情况:
>
> total 134036K
>
> *果然只有 100 多 MB 的 RAM 占用*,哈哈!
>
> 稍后,我得空了,再利用 Inline 模块封装为 Perl 可调用的形式,呵呵。
>
> C++ 写得不好,欢迎大家指正 :)
>
> Cheers,
> -agentzh
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

真的猜对了
一个ASCII字符一般是一byte是占用8个bit (二进制)
agent大侠的算法应该是用位实现的(我今天没时间down下来研究)

这里有关于perl位运算的文档

http://perldoc.perl.org/perlop.html#Bitwise-And

2009/9/23 Beckheng Lam <bi.ken.lam@gmail.com>
0b是二进制数值 就好像0x是十六进制 0... 会表示为八进制一样。

以上纯属猜测,如有雷同,实属撞。。。

空格 wrote:
> 这个似乎是目前最节省内存的方法,不过我还是不太明白。
> 在perl里如何实现你说的这个二进制的bit运算?抱歉我不知道用什么语句能实现这个"2位表示一个字符"。
> 另外这个:
> $char = $key & 0b000011;
> 我也不太明白, & 后面的这个0b000011如果就是转换了的bit运算结果,那么0b对应什么意思?
>
>
> On 9月23日, 下午5时49分, truncatei <trunca...@gmail.com> wrote:
>
>> bit运算应该是这样:
>> 2位表示一个字符
>> 00 A
>> 01 G
>> 10 T
>> 11 C
>>
>> 这样下来一个15个字符的序列一共30位,一个int足矣,必用字符串省很多内存
>>
>> 取各个位
>> 如:
>> $char = $key & 0b000011;
>> $char = $key & 0b001100;
>> $char = $key & 0b110000
>> ...
>> 取出每个位以后再做判断
>> $char == 0;
>> $char == 1;
>> $char == 2;
>> $char == 4;
>>
>> 2009/9/23 空格 <ribozyme2...@gmail.com>
>>
>>
>>> 我昏了,之前我把00,01,10,11理解成十进制的数字了。
>>> 就是说,
>>> 当取到一个字串赋给$key之后,
>>> $key=~s{A}{0}g;
>>> $key=~s{G}{1}g;
>>> $key=~s{T}{2}g;
>>> $key=~s{C}{3}g;
>>> 再用 exists(%hash{$key}); 检查是否有特定键值。是这样的吧?
>>>
>>> On 9月23日, 上午11时17分, msmouse <msmo...@gmail.com> wrote:
>>>
>>>> 就是这个意思。前面agentzh说:
>>>> "事先约定 A,T,G,C 分别对应 00, 01, 10, 11,即 2 个比特的数值。"
>>>> 即用两个位表示一个字符,15个字符即是30位。30个二进制位即是15个4进制位
>>>> ----------------------------------
>>>> msmo...@ir.hit.edu.cn
>>>> msmo...@gmail.com
>>>>

--
Perl乐事 -- http://www.perlersh.org
我的博客 -- http://www.perlersh.org/blog.html





--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 请问perl读文本文件,怎么样从末尾往前读?

 open my $F1, " XXX cmd | " ; 
 while (<$F1>) {   
    ...
  }
该管道和命令输出是同步的,和 |tee类似
 
3。 seek +tell 也可以啊,自己可以控制

 
 
2009/9/23 msmouse <msmouse@gmail.com>
针对字节的就行呗,自己查换行

另外tac应该到处有吧?
----------------------------------
msmouse@ir.hit.edu.cn
msmouse@gmail.com


2009/9/23 zheng wen <yzwen9999@gmail.com>

现在处理一个log文件,想分析最近几分钟的log,现有以下方案:
1,用tail是可以的,但是不太好估计tail多少行,tail N行->判断->tail 2N行 貌似可以动态判断,但比较繁琐,个人不赞成
2,从前面正向读的话觉得读了前面一堆没有必要的行,文件大了会很慢,循环里面有一堆正则处理的东西
3,用tac file | 然后读管道,貌似比较不错,但不是很清楚所有server上是否都有tac命令,而且也不知道性能怎样?
<4>,Perl里面从文件末尾开始向前读,不知道有没有简单的办法可以实现?seek tell的位置貌似都针对字节的。

针对4,有什么方法实现么?或者有没有其他的方案。简单有效的最好。

谢谢!





--
           Yours Sincerely
                   Zeng Hong

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

这个。。怎么说呢。。处理字符串正是perl的强项。。因为perl有变量内插和正则表达式
跟c对比觉得不方便的时候就是它不能按字符索引操作而已,或者说跟c的区别在于perl字符串不是字符数组

就现在的问题来看,操作一个128M的字符串,当做一个1G下标的位数组来用,其实也没有太不方便了。。当然要慢很多,毕竟不是数组
总之 这个事情perl不好做是因为资源不够用。。而不是处理字符串不强。。否则一个hash不就搞定了


----------------------------------
msmouse@ir.hit.edu.cn
msmouse@gmail.com


2009/9/23 Michael Zeng <galaxy2004@gmail.com>
用perl处理字符串本来就不是强项
 
就是index, substr , split 几个函数,觉得 到了关键还得用c
 


 
2009/9/23 msmouse <msmouse@gmail.com>
这和我说的是同一个方法 跟agentzh的c++也是同一个方法

他演示的是从一个计算出来的index里面取两个二进制位的方法

看一下agentzh的c++程序吧,看懂了你就明白了。。


----------------------------------
msmouse@ir.hit.edu.cn
msmouse@gmail.com


2009/9/23 空格 <ribozyme2004@gmail.com>
这个似乎是目前最节省内存的方法,不过我还是不太明白。

在perl里如何实现你说的这个二进制的bit运算?抱歉我不知道用什么语句能实现这个"2位表示一个字符"。
另外这个:
$char = $key & 0b000011;
我也不太明白, & 后面的这个0b000011如果就是转换了的bit运算结果,那么0b对应什么意思?


On 9月23日, 下午5时49分, truncatei <trunca...@gmail.com> wrote:
> bit运算应该是这样:
> 2位表示一个字符
> 00 A
> 01 G
> 10 T
> 11 C
>
> 这样下来一个15个字符的序列一共30位,一个int足矣,必用字符串省很多内存
>
> 取各个位
> 如:
> $char = $key & 0b000011;
> $char = $key & 0b001100;
> $char = $key & 0b110000
> ...
> 取出每个位以后再做判断
> $char == 0;
> $char == 1;
> $char == 2;
> $char == 4;
>
> 2009/9/23 空格 <ribozyme2...@gmail.com>
>
> > 我昏了,之前我把00,01,10,11理解成十进制的数字了。
> > 就是说,
> > 当取到一个字串赋给$key之后,
> > $key=~s{A}{0}g;
> > $key=~s{G}{1}g;
> > $key=~s{T}{2}g;
> > $key=~s{C}{3}g;
> > 再用 exists(%hash{$key}); 检查是否有特定键值。是这样的吧?
>
> > On 9月23日, 上午11时17分, msmouse <msmo...@gmail.com> wrote:
> > > 就是这个意思。前面agentzh说:
> > > "事先约定 A,T,G,C 分别对应 00, 01, 10, 11,即 2 个比特的数值。"
> > > 即用两个位表示一个字符,15个字符即是30位。30个二进制位即是15个4进制位
> > > ----------------------------------
> > > msmo...@ir.hit.edu.cn
> > > msmo...@gmail.com




--
           Yours Sincerely
                   Zeng Hong




--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

用perl处理字符串本来就不是强项
 
就是index, substr , split 几个函数,觉得 到了关键还得用c
 


 
2009/9/23 msmouse <msmouse@gmail.com>
这和我说的是同一个方法 跟agentzh的c++也是同一个方法
他演示的是从一个计算出来的index里面取两个二进制位的方法

看一下agentzh的c++程序吧,看懂了你就明白了。。


----------------------------------
msmouse@ir.hit.edu.cn
msmouse@gmail.com


2009/9/23 空格 <ribozyme2004@gmail.com>
这个似乎是目前最节省内存的方法,不过我还是不太明白。

在perl里如何实现你说的这个二进制的bit运算?抱歉我不知道用什么语句能实现这个“2位表示一个字符”。
另外这个:
$char = $key & 0b000011;
我也不太明白, & 后面的这个0b000011如果就是转换了的bit运算结果,那么0b对应什么意思?


On 9月23日, 下午5时49分, truncatei <trunca...@gmail.com> wrote:
> bit运算应该是这样:
> 2位表示一个字符
> 00 A
> 01 G
> 10 T
> 11 C
>
> 这样下来一个15个字符的序列一共30位,一个int足矣,必用字符串省很多内存
>
> 取各个位
> 如:
> $char = $key & 0b000011;
> $char = $key & 0b001100;
> $char = $key & 0b110000
> ...
> 取出每个位以后再做判断
> $char == 0;
> $char == 1;
> $char == 2;
> $char == 4;
>
> 2009/9/23 空格 <ribozyme2...@gmail.com>
>
> > 我昏了,之前我把00,01,10,11理解成十进制的数字了。
> > 就是说,
> > 当取到一个字串赋给$key之后,
> > $key=~s{A}{0}g;
> > $key=~s{G}{1}g;
> > $key=~s{T}{2}g;
> > $key=~s{C}{3}g;
> > 再用 exists(%hash{$key}); 检查是否有特定键值。是这样的吧?
>
> > On 9月23日, 上午11时17分, msmouse <msmo...@gmail.com> wrote:
> > > 就是这个意思。前面agentzh说:
> > > ”事先约定 A,T,G,C 分别对应 00, 01, 10, 11,即 2 个比特的数值。“
> > > 即用两个位表示一个字符,15个字符即是30位。30个二进制位即是15个4进制位
> > > ----------------------------------
> > > msmo...@ir.hit.edu.cn
> > > msmo...@gmail.com




--
           Yours Sincerely
                   Zeng Hong

--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] perl大会举办的很不错啊!

看了2009年的perl大会照片,很不错啊,明年也该参加了!




你的搜狐好友邀你领取"神秘礼包"
抽奖换礼,好运有你!
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

[PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?

这和我说的是同一个方法 跟agentzh的c++也是同一个方法
他演示的是从一个计算出来的index里面取两个二进制位的方法

看一下agentzh的c++程序吧,看懂了你就明白了。。

----------------------------------
msmouse@ir.hit.edu.cn
msmouse@gmail.com


2009/9/23 空格 <ribozyme2004@gmail.com>
这个似乎是目前最节省内存的方法,不过我还是不太明白。
在perl里如何实现你说的这个二进制的bit运算?抱歉我不知道用什么语句能实现这个"2位表示一个字符"。
另外这个:
$char = $key & 0b000011;
我也不太明白, & 后面的这个0b000011如果就是转换了的bit运算结果,那么0b对应什么意思?


On 9月23日, 下午5时49分, truncatei <trunca...@gmail.com> wrote:
> bit运算应该是这样:
> 2位表示一个字符
> 00 A
> 01 G
> 10 T
> 11 C
>
> 这样下来一个15个字符的序列一共30位,一个int足矣,必用字符串省很多内存
>
> 取各个位
> 如:
> $char = $key & 0b000011;
> $char = $key & 0b001100;
> $char = $key & 0b110000
> ...
> 取出每个位以后再做判断
> $char == 0;
> $char == 1;
> $char == 2;
> $char == 4;
>
> 2009/9/23 空格 <ribozyme2...@gmail.com>
>
> > 我昏了,之前我把00,01,10,11理解成十进制的数字了。
> > 就是说,
> > 当取到一个字串赋给$key之后,
> > $key=~s{A}{0}g;
> > $key=~s{G}{1}g;
> > $key=~s{T}{2}g;
> > $key=~s{C}{3}g;
> > 再用 exists(%hash{$key}); 检查是否有特定键值。是这样的吧?
>
> > On 9月23日, 上午11时17分, msmouse <msmo...@gmail.com> wrote:
> > > 就是这个意思。前面agentzh说:
> > > "事先约定 A,T,G,C 分别对应 00, 01, 10, 11,即 2 个比特的数值。"
> > > 即用两个位表示一个字符,15个字符即是30位。30个二进制位即是15个4进制位
> > > ----------------------------------
> > > msmo...@ir.hit.edu.cn
> > > msmo...@gmail.com



--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
 要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
 要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
 更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛

-~----------~----~----~----~------~----~------~--~---

Re: 一个基于位数组的序列覆盖率分析器 (Was Re: [PerlChina] Re: 在我遇到的这种情况下散列和数组哪个快?)

大赞!正在下载学习中...

On 9月23日, 下午6时04分, agentzh <agen...@gmail.com> wrote:
> 2009/9/23 agentzh <agen...@gmail.com>:
>
>
>
> > 今天晚些时候,我会提供一个 C++ 实现 ;)
>
> 刚刚写了一个 ANSI C++ 实现,呵呵,也不过 *180 行代码*,在 Linux 和 Win32 上进行了简单的测试。代码我作为 appears
> 项目放在了 GitHub 上面:
>
> http://github.com/agentzh/appears
>
> 如果没有 git 或者不熟悉 git,可以直接从下面的页面下载 v0.01 版的压缩包:
>
> http://github.com/agentzh/appears/downloads
>
> 解压后的编译和用法见 README 和 Makefile.
>
> 简单说来,在 Win32 上使用
>
> nmake -f NMakefile
>
> 来编译。然后用命令
>
> appears.exe input.txt
>
> 来分析输入文件 input.txt
>
> 在 Linux 上则直接
>
> make
>
> 程序用法是
>
> ./appears input.txt
>
> 为了测试方便,上面的项目构造过程还会生成 appears1 和 appears2 这两个程序,分别对应序列长度为 1 和 2 的情形(默认的
> appears 对应 15)。
>
> 仅进行了简单的测试,欢迎同学们提供更彻底的基于 Perl 的测试集,哈哈!
>
> 在 Linux 利用 pmap 检查 appears 程序的内存占用情况:
>
> total 134036K
>
> *果然只有 100 多 MB 的 RAM 占用*,哈哈!
>
> 稍后,我得空了,再利用 Inline 模块封装为 Perl 可调用的形式,呵呵。
>
> C++ 写得不好,欢迎大家指正 :)
>
> Cheers,
> -agentzh
--~--~---------~--~----~------------~-------~--~----~
您收到此信息是由于您订阅了 Google 论坛"PerlChina Mongers 讨论组"论坛。
要在此论坛发帖,请发电子邮件到 perlchina@googlegroups.com
要退订此论坛,请发邮件至 perlchina+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/perlchina?hl=zh-CN 访问该论坛
-~----------~----~----~----~------~----~------~--~---

 
骚扰好友,送神秘礼包
抽奖换礼,好运有你!