windows - "Out of memory"带有简单的 Win32::Unicode::File readline 循环和 Strawberry Perl

标签 windows perl memory-leaks windows-xp strawberry-perl

可以通过在 Windows XP 上的 Strawberry perl 5.12.3.0 中运行以下代码来发现我遇到的问题。

    #!/usr/bin/perl -w

    use strict;
    use warnings;
    use Win32::Unicode::File;
    use Encode;

    my $fname = shift @ARGV;

    my $fh = Win32::Unicode::File->new;
    if ($fh->open('<', $fname)){
      while (my $line = $fh->readline()){}
      close $fh;
    }else{
      print "Couldn't open file: $!\n";
    }

这里唯一发生的事情是我执行了一个 readline,这一直在消耗内存,直到我从 Strawberry perl 收到内存不足错误。我正在使用一个非常大的文件,但由于此代码是基于流的,所以应该无关紧要。我在这里遗漏了什么或者 Strawberry perl 的某处有泄漏吗?我在 ActivePerl 中测试了完全相同的代码,它运行良好,即它不会占用内存。

更新:用普通菱形运算符替换 Win32::Unicode::File 似乎至少适用于我的发行版。请参见以下代码。

    use strict;
    use warnings;

    my $fname = shift @ARGV;

    if (open(my $fh, '<', $fname)){
      while (my $line = <$fh>){}
      close $fh;
    }else{ print "Couldn't open file: $!\n";}

那么这表明问题出在 Win32::Unicode 模块上,对吗?

最佳答案

也许 $/(或 $INPUT_RECORD_SEPARATOR)不是新行? 或 $[(第一个数组元素的索引和(子)字符串中的第一个字符)不为 0。

模块在读取或读取行期间使用这两个变量。

顺便说一句:它太慢了,因为它使用 3 个函数调用一次读取每一行一个字符,然后为每个读取的字符调用 Encode::decode,然后将其添加到 readline 返回给您的代码的行缓冲区。呸!

关于windows - "Out of memory"带有简单的 Win32::Unicode::File readline 循环和 Strawberry Perl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8710934/

相关文章:

c# - 在 C# 中使用 Windows 默认编辑器打开图像

c++ - 通过 WinAPI 在控制台应用程序中使用多种字体类型

json - 将目录及其子目录的内容转换为 JSON

perl - 在 Perl 中检测全局破坏

javascript - 外部javascript文件导致ie内存泄漏

c++ - 来自 Shell Execute 的 Quiet MSI Exec

database - 打开标准 Jet DB 4.0 文件 (*.vmd)

perl - 如何在任何操作系统上启动 Perl 中的默认 Web 浏览器?

android - PropertyChangedEventHandler 导致内存泄漏

c - 无法分配信号量/netconn Tiva C TM4C1294