gpt4 book ai didi

珀尔 :Out of Memory Error while building a 2d array at run time

转载 作者:行者123 更新时间:2023-12-02 06:58:20 25 4
gpt4 key购买 nike

我是 perl 初学者。我正在尝试在运行时从二进制文件构建一个二维数组。我收到“内存不足”错误。我在 windows7 中使用 Perl 5.16.3。我的输入文件大小约为 4.2MB。我的系统有 4GB 的物理内存,我的使用率达到 90%,然后在运行此代码时显示内存不足错误。

我尝试了很多方法来调试它。只有当我将 b32 减少到 b16 或更少时,我才能成功运行。即使这样,如果文件大小增加超过 4MB,错误也会再次出现。我尝试在执行代码时查看任务管理器中的物理内存使用情况,它一直在增加。

我的 friend 怀疑这应该是内存泄漏问题。我无法辨认出他的嫌疑人。我需要帮助来解决这个问题。

#!/usr/bin/perl
use strict;
use warnings;

open( DATA, 'debug.bin' ) or die "Unable to open:$!";
binmode DATA;
my ( $data, $n, $i );
my @2dmatrix;
while ( $n = read DATA, $data, 4 ) {
push @2dmatrix, [ split( '', unpack( 'b32', $data ) ) ];
}
print scalar(@2dmatrix);
print "completed reading";
close(DATA);

只是为了清除要求。从二维数组构建中,我需要从对应于 B 列中特定模式 (11111111000000001111111100000000) 的 A 列中提取内容。这需要在文件大小为 500Mb 的 4 组列上完成。

最佳答案

这不是内存泄漏,您的程序在内存使用方面效率非常低。

对于您读入的每 4 个字节,您执行一个 unpack 'b32',这将创建一个 32 个字符的字符串; split// 它,将它变成 32 个 1 字符的字符串,生成结果列表的 arrayref,并将 arrayref 压入 @2dmatrix。结果是:

  • 32 个字符串主体,每个至少 2 个字节(对于 "0\0""1\0")尽管 perl 可能决定使用更多以避免重新分配如果字符串增长:64 字节。
  • 32 个 SVPV(包含字符串的标量变量,32 位每个 28 个字节,64 位每个 40 个字节):896 或 1280 个字节。
  • 1 个包含 32 个条目的数组主体:32 位 128 字节,64 位 256 字节。
  • 1 AV(数组变量):32 位 28 字节,64 位 40 字节。
  • 1 SVRV(包含引用的标量):32 位 16 字节,64 位 24 字节。
  • @2dmatrix 数组主体中的 1 个条目:32 位上 4 个字节,64 位上 8 个字节。

结果是在 32 位上每 4 字节有 1136 字节(284 倍乘法),在 64 位上每 4 字节有 1672 字节(418 倍乘法),不考虑常数因子和 perl 可能选择使用更大的事实字符串主体(在我在这里测试的两个版本的 perl 上,我得到 10 或 16 个字节,而不是 2 个。)因此,您的程序将使用超过 1.1GB 的内存来处理 32 位系统上的 4.2MB 输入,甚至更高对于 64 位系统上的 4.2MB 输入,需要 1.7GB 的内存。

这里的解决方案是以更有效的方式存储和访问数据,但我无法提供任何具体建议,因为您还没有说出您实际想要做什么 @2dmatrix 一旦你拥有它。

关于珀尔 :Out of Memory Error while building a 2d array at run time,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26703281/

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