0

私は以下のような約30ギガバイトのゲノムファイルを持っています、

>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内部で可能な限り多くの作業を実行する必要があります。これは、ファイルを1文字ずつ読み取るのが遅いことを意味します。

myまた、グローバルの代わりに(で宣言された)レキシカル変数を使用します。これにより、パフォーマンスが向上する可能性があります。

自然なレコード区切り文字(のような\n)を選択するか、特定のバイト数を読み取ります。

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

perlvarを参照)

あなたはまた、あなたのために、そしてあなたのためにさえするすべての贅沢を流しopen、そして完全な制御のために使うことができます。しかし、そのように狂気があります。readlinegetcsysopensysread

# 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 に答える