gpt4 book ai didi

perl - 从命令性能读取

转载 作者:行者123 更新时间:2023-12-02 03:36:15 24 4
gpt4 key购买 nike

我的目标是对来自流程的数据(基于行)进行一些正则表达式和一些处理。由于我已经有了一堆 perl 工具,所以我决定使用 perl 来解决我的问题。

假设一个输出大文件的进程:

猫大文件.txt | grep "一个字符串"

显然,我要调用的进程不是“cat”,而是输出一堆行(通常是 100 GB 的数据)的进程。

我怀疑我的 perl 程序的性能,我开始将代码精简到最少。我意识到我的问题可能来 self 读取 perl 命令输出的方式。

这是我的 perl 脚本:

#!/usr/bin/perl

use strict;

open my $fh, "cat LARGE.txt |";
while (<$fh>) {
print $_ if $_ =~ qr/REGEX NOT TO BE FOUND/o;
}

我决定将我的程序与简单的 bash 命令进行比较:

cat LARGE.txt | grep "REGEX NOT TO BE FOUND"

结果:

time cat LARGE.txt | grep "REGEX NOT TO BE FOUND"
real 0m0.615s
user 0m0.352s
sys 0m0.873s

time ./test.pl

real 0m37.339s
user 0m36.621s
sys 0m1.766s

在我的示例中,LARGE.txt 文件大约为 1.3GB。

我知道 perl 解决方案可能比 cat | 慢grep 示例,但我没想到会有这么大的差异。

我读取命令输出的方式有问题吗?

附言我在 Linux 机器上使用 perl v5.10.1

最佳答案

你可以试试 sysread:

(盗自:http://www.perlmonks.org/?node_id=457046)

use warnings;
use strict;
use Data::Dumper;

my $filename = "test.txt";

die "filename not found\n" unless -f $filename;

my $size = -s $filename;
my $total_read = 0;

open my $fh, "<", $filename or die "can't open $filename\n";
binmode($fh);

my $bufsize = 8192; # typical size for i/o buffers
my ( $databuf, $readbuf, $nread );
while (( $nread = sysread( $fh, $readbuf, $bufsize )) > 0 ) {
$databuf .= $readbuf;
process_lines_from_buffer(\$databuf);
}
print "initial size: $size\n";

sub process_lines_from_buffer{
### to make it efficient do not use a named variable for the buffer
return undef if ! defined $_[0];
while (${$_[0]} =~ s!(.*?)\n!!){
### do your processing
process_line(\$1);
}
}
sub process_line {
print ${$_[0]}."\n";
}

关于perl - 从命令性能读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com