簡體   English   中英

需要有關perl內存使用的建議

[英]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)];

有沒有辦法有效地處理它?

注意:在任何情況下,都需要在任何執行時盡快訪問數組(因為用戶不能等待太久)

我試過的選項:

  1. DBM ::深 - 需要更多時間
  2. PDL - 為32 x 8MB雙倍數組提供“內存不足”錯誤

等待您寶貴的建議!

32個數組* 8個Mi-double / array * 8個字節/ double = 2個GiB。

Windows上的32位進程只有2GiB的可用地址空間。 您的原始數據將占用所有可用的地址空間,不會為數據結構的開銷, perl ,程序和其他變量留下任何內容。 它適合內存的唯一方法是切換到64位Perl。 否則,您將不得不面對必然較慢的解決方案。

這將為每個元素創建一個perl值,這將非常重。 您可能希望查看將值存儲為雙精度值的內容,例如Tie :: CArrayTie :: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM