0

我有大约 30 GB 的基因组文件,如下所示,

>2RHet assembled 2006-03-27 md5sum:88c0ac39ebe4d9ef5a8f58cd746c9810
GAGAGGTGTGGAGAGGAGAGGAGAGGAGTGGTGAGGAGAGGAGAGGTGAG
GAGAGGAGAGGAGAGGAGAGGAATGGAGAGGAGAGGAGTCGAGAGGAGAG
GAGAGGAGTGGTGAGGAGAGGAGAGGAGTGGAGAGGAGACGTGAGGAGTG
GAGAGGAGAGTAGTGGAGAGGAGTGGAGAGGAGAGGAGAGGAGAGGACGG
ATTGTGTTGAGGACGGATTGTGTTACACTGATCGATGGCCGAGAACGAAC

我正在尝试解析文件并快速完成我的任务,逐个字符地使用下面的代码,但字符没有被打印出来

open (FH,"<:raw",'genome.txt') or die "cant open the file $!\n";

until ( eof(FH) ) {

$ch = getc(FH);
print "$ch\n";# not printing ch

}
close FH;
4

1 回答 1

3

你的错误是忘记了eof

until (eof FH) { ... }

但这不太可能是最有效的解决方案:Perl 比……C 慢,所以我们希望循环迭代尽可能少,并且在 perl 内部完成尽可能多的工作。这意味着逐字符读取文件速度很

另外,使用词法变量(用 声明my)而不是全局变量;这可以提高性能。

要么选择一个自然的记录分隔符(如\n),要么读取一定数量的字节:

local $/ = \256; # read 256 bytes at a time.
while (<FH>) {
  # do something with the bytes
}

(见perlvar

你也可以摆脱所有的奢侈品openreadline甚至getc为你做的,使用sysopensysread完全控制。然而,这种方式是疯狂的。

# not tested; I will *not* use sysread.
use Fcntl;
use constant NUM_OF_CHARS => 1; # equivalent to getc; set higher maybe.
sysopen FH, "genome.txt", O_RDONLY or die;

my $char;
while (sysread FH, $char, NUM_OF_CHARS, 0) {
  print($char .= "\n");  # appending should be better than concatenation.
}

如果我们走了那么远,使用Inline::C只是一个小步骤,可能更可取。

于 2013-01-24T20:48:27.373 回答