[英]Need advice for Memory usage in perl
我不是perl的新手,但我無法解決這個問題。
這是我的問題陳述:
我正在使用Activestate perl 5.12 32位。 我希望一次在內存中保留一些32 x 8MB的雙重數組。 不幸的是,在這種情況下我得到了“內存不足”的錯誤。 例如,下面的代碼將導致內存不足。
my $aref1 = [(.25) x (8*1024*1024)];
my $aref2 = [(.25) x (8*1024*1024)];
my $aref3 = [(.25) x (8*1024*1024)];
my $aref4 = [(.25) x (8*1024*1024)];
my $aref5 = [(.25) x (8*1024*1024)];
my $aref6 = [(.25) x (8*1024*1024)];
my $aref7 = [(.25) x (8*1024*1024)];
my $aref8 = [(.25) x (8*1024*1024)];
my $aref9 = [(.25) x (8*1024*1024)];
my $aref10 = [(.25) x (8*1024*1024)];
有沒有辦法有效地處理它?
注意:在任何情況下,都需要在任何執行時盡快訪問數組(因為用戶不能等待太久)
我試過的選項:
等待您寶貴的建議!
32個數組* 8個Mi-double / array * 8個字節/ double = 2個GiB。
Windows上的32位進程只有2GiB的可用地址空間。 您的原始數據將占用所有可用的地址空間,不會為數據結構的開銷, perl
,程序和其他變量留下任何內容。 它適合內存的唯一方法是切換到64位Perl。 否則,您將不得不面對必然較慢的解決方案。
這將為每個元素創建一個perl值,這將非常重。 您可能希望查看將值存儲為雙精度值的內容,例如Tie :: CArray或Tie :: Array :: PackedC 。
以下是我使用ActiveState Perl 5.14.2在Windows XP SP3系統上獲得的內容。 當我運行以下腳本時,任務管理器顯示Commit charge: 778M/3958M
:
#!/usr/bin/env perl
use strict;
use warnings;
use Devel::Size qw(total_size);
my $unit = 1024 * 1024;
my $topj = (8 * $unit) - 1;
my @data;
for my $i (0 .. 31) {
print "$i: ";
my @row;
$#row = $topj;
for my $j (0 .. $topj) {
$row[$j] = 0.25;
}
push @data, \@row;
printf "%.0f\n", total_size(\@data)/$unit;
}
輸出:
C:\temp> yy 0: 224 1: 448 2: 672 3: 896 4: 1120 5: 1344 6: 1568 7: 1792 Out of memory! 8:
另一方面,以下C程序做得更好:
#include <stdlib.h>
#include <stdio.h>
#define ROWSIZE 8*1024*1024
int main(void) {
int n = 1;
while (calloc(ROWSIZE, sizeof(double))) {
printf("%d: success!\n", n);
n += 1;
}
return 0;
}
輸出:
1: success! 2: success! 3: success! … 26: success! 27: success!
相同的1.7GB足跡。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.