【发布时间】:2016-08-17 07:26:16
【问题描述】:
我有一个需要处理的行很长的文件,我发现该过程卡住/“真的很慢”,因为缓冲区不够大,或者由于处理很长的行可能需要尽管。这是一个代码示例:
open FH, "<$fname" or die "...";
while (<FH>) {
my @arr = split //, $_;
pop @arr;
pop @arr;
... for some "limited small portion of the string length" number of times ...
pop @arr;
if ($arr[-1] eq '0') {
print "done!\n";
last;
}
push @big_arr, join('', @arr);
}
线路处理并不“繁重”。
我找了一些东西来解决它并遇到了PerlIO::buffersize,但它看起来已经有一段时间没有维护了,我不想使用版本为 0.001 的模块。如何修改<> 运算符缓冲区大小?或者,在使用<> 阅读之前,有什么方法可以知道行长?
【问题讨论】:
-
嗯,您也可以将
$/设置为要读取的字节数的数值。 -
您可以转到比
readline(<>) 更低的级别并使用read。File::Stream也可能有帮助。 -
@yonyon100:请告诉我们“非常长的行”的长度和文件的总大小。
-
my @arr = split //, $_;一次遍历你的字符串一个字符,所以是的,长行需要一段时间。这就是为什么you should always explain your actual problem instead of the solution you think will work;你找错树了! -
我认为您应该发布一个新问题并解释您要解决的实际问题,并附上示例输入和输出。展示您当前的解决方案并说明您的性能要求,例如“我想在 30 秒内处理一个 20MB 的单行文件。”
标签: perl buffer file-handling