4

私は perl を初めて使用するわけではありませんが、このユースケースを解決できませんでした。

ここに私の問題文があります:

Activestate perl 5.12 32 ビットを使用しています。一度に 32 x 8MB の double の配列をメモリに保持したいと考えています。残念ながら、この場合、「メモリ不足」エラーが発生します。たとえば、次のコードはメモリ不足につながります。

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::Deep - 時間がかかる
  2. PDL - double の 32 x 8MB 配列で「メモリ不足」エラーが発生する

貴重なご提案お待ちしております!

4

3 に答える 3

11

32 配列 * 8 Mi-double/配列 * 8 バイト/double = 2 GiB。

Windows 上の 32 ビット プロセスには、2GiB の使用可能なアドレス空間しかありません。生データは利用可能なすべてのアドレス空間を占有し、データ構造のオーバーヘッド、perlプログラム、およびその他の変数には何も残しません。メモリに収まる唯一の方法は、64 ビット Perl に切り替えることです。それ以外の場合は、必然的に遅いソリューションと競合する必要があります。

于 2012-12-19T00:55:26.900 に答える
3

これにより、要素ごとに perl 値が作成されますが、これは非常に重くなります。Tie::CArrayTie::Array::PackedCなど、値を double として格納するものを見たいと思うかもしれません。

于 2012-12-19T00:42:27.147 に答える
2

これは、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
メモリ不足です。
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:成功!
2:成功!
3:成功!
…
26:成功!
27:成功!

同じ 1.7GB フットプリントの場合。

于 2012-12-19T15:48:55.477 に答える