- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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
。结果是:
"0\0"
或 "1\0"
)尽管 perl 可能决定使用更多以避免重新分配如果字符串增长:64 字节。@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/
我是一名优秀的程序员,十分优秀!