0

我对 tie::file 模块有两个疑问

  1. 我使用 tie::file 模块对 55 MB 的文件进行搜索,并在 tie::file 中设置了 20 MB 的内存。当我尝试在绑定数组上 grep 以查找搜索字符串时,它需要很长时间。有什么解决办法吗?

  2. 可以 tie::file 用于读取二进制文件。绑定数组由“\n”分隔。如何使用 tie::file 读取二进制文件?你能贴我一些示例代码吗?

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

/home/a814899> 回声“你好世界”>> 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 回答