【问题标题】:performance of perl scriptperl 脚本的性能
【发布时间】:2015-03-10 11:32:15
【问题描述】:

我正在尝试读取动态记录长度的二进制文件。其中有如下数据:

field1field2field3field4vector1vector2

现在field3定义了向量的出现

对于 ex field3 为 2,则将存在 vector1&2,如果值为 3,则将存在 vector1,2&3。

我编写了下面的代码,它工作正常,但性能很差。

假设 field1-4 是固定的,长度为 2652,每个向量长度为​​ 301。 field3 距离位置 2396 3 个字节。

my $string;
my $rep_factor;
my $size;

open (FILE, $ARGV[0]) or die $!;
my $re = 2396;
my $rec = 0;
while (<FILE>) {
   seek(FILE,$re,0);
   read(FILE,$rep_factor,2);
   my $rep_fact = undefined2defined(convert2ascii_decimal($rep_factor,0));
   $size = ($rep_fact * 301) + 2652;
   seek(FILE,$rec,0);
   read FILE,$string,$size;

   filewrite ($ARGV[1], recordparse($string));
   $rec = $size + $rec;
   $re = $size + 2396;
}

请帮我写代码,因为我是 perl 新手,在这里想不出什么。

谢谢, 灰烬

【问题讨论】:

  • 如果代码按预期工作,但您想提高其性能,那么Code Review 不适合问这个问题吗?
  • 你见过unpack吗?
  • packunpack 通常用于读取二进制格式,请查看/ 模板字符。
  • 我已经创建了解压二进制字符串的函数....性能问题在于文件的读取

标签: perl file scripting


【解决方案1】:

while (&lt;FILE&gt;) 将您的文件读入$_,直到找到输入记录分隔符的值($/,通常默认为\n)或EOF。但是,与其使用$_ 中的数据,不如返回$re 并再次阅读。最后,块结束,循环再次使用&lt;FILE&gt; 进行测试,它从文件句柄的当前位置读取,直到找到输入记录分隔符或 EOF。

如果您像这样修改循环,您可以避免所有这些重复读取:

do {
   seek(FILE,$re,0);
   read(FILE,$rep_factor,2);
   my $rep_fact = undefined2defined(convert2ascii_decimal($rep_factor,0));
   $size = ($rep_fact * 301) + 2652;
   seek(FILE,$rec,0);
   read FILE,$string,$size;

   filewrite ($ARGV[1], recordparse($string));
   $rec = $size + $rec;
   $re = $size + 2396;
} until eof(FILE);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多