0

tie::fileモジュールについて2つのクエリがあります

  1. tie ::fileモジュールを使用して55MBのファイルを検索し、tie::fileに20MBのメモリを設定しました。結合された配列で検索文字列をgrepしようとすると、かなりの時間がかかります。回避策はありますか?

  2. バイナリファイルの読み取りに使用されるtie::fileを使用できます。結合された配列は「\n」で区切られます。tie :: fileを使用してバイナリファイルを読み取るにはどうすればよいですか?サンプルコードを貼り付けていただけませんか。

/ home / a814899> perl -e'print "x \ n" x27 for 1..1024 * 1024;' > a

/ home / a814899> echo "hello world" >> a

Using Unix grep

/home/a814899> time grep "hello " a
hello world

real    0m8.280s
user    0m8.129s
sys     0m0.139s

Using the regex

/home/a814899> (time perl -e 'while (<>) { if (/hello/) { print "hello world"} }' a)
hello world
real    0m51.316s
user    0m51.087s
sys     0m0.189s


Using Perl Grep

#!/usr/bin/perl
print "executing\n";
my $outputFileDir="/home/a814899";
my $sFileName="a";
open my $fh, "<", $outputFileDir . "/" . $sFileName or do {
       print "Could not open the file";
    };
print "success  in open" . "\n";
my @out=grep {/hello world/} <$fh> ;
print "@out" ;
close($fh)
4

1 に答える 1

2
  1. はい。

    これはおそらくTie::Fileを使用して行った方法です:

    $ (
        time perl -MTie::File -e'
           tie @a, "Tie::File", $ARGV[0];
           for (@a) { if (/y/) { } }
        ' a
    ) 2>&1 | grep real
    real    2m44.333s
    

    これが「回避策」です。

    $ (
        time perl -e'
            while (<>) { if (/y/) { } }
        ' a
    ) 2>&1 | grep real
    real    0m0.644s
    

    データファイルはを使用して作成されました

    $ perl -E'say "x"x54 for 1..1024*1024;' >a
    
  2. Tie::Fileはファイルを読み取りません。Tie :: Fileは、ファイルの行を配列要素にマッピングする手段を提供します。「バイナリ」ファイルには行がないため、Tie::Fileを使用して行にアクセスしても意味がありません。

于 2013-01-18T01:03:08.830 に答える