32GB RAM を搭載した Mac サーバー (snow leopard) を使用しています。Perl (v 5.10.0) で 1.1GB を超える RAM を割り当てようとすると、メモリ不足エラーが発生します。使用したスクリプトは次のとおりです。
#!/usr/bin/env perl
# My snow leopard MAC server runs out of memory at >1.1 billion bytes. How
# can this be when I have 32 GB of memory installed? Allocating up to 4
# billion bytes works on a Dell Win7 12GB RAM machine.
# perl -v
# This is perl, v5.10.0 built for darwin-thread-multi-2level
# (with 2 registered patches, see perl -V for more detail)
use strict;
use warnings;
my $s;
print "Trying 1.1 GB...";
$s = "a" x 1100000000; # ok
print "OK\n\n";
print "Trying 1.2 GB...";
$s = '';
$s = "a" x 1200000000; # fails
print "..OK\n";
これが私が得る出力です:
Trying 1.1 GB...OK
perl(96685) malloc: *** mmap(size=1200001024) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Out of memory!
Trying 1.2 GB...
なぜこれが起こっているのですか?
更新 4:42pm 11/14/13
Kent Fredric (以下の 2 つの投稿を参照) によると、これが私の ulimits です。仮想メモリのデフォルトは無制限
$ ulimit -a | grep バイト データ セグメント サイズ (キロバイト、-d) 無制限 最大ロック メモリ (キロバイト、-l) 無制限 最大メモリ サイズ (キロバイト、-m) 無制限 パイプ サイズ (512 バイト、-p) 1 スタックサイズ (キロバイト、-s) 8192 仮想メモリ (キロバイト、-v) 無制限 $ perl -E 'my $x = "a" x 1200000000; print "ok\n"' perl(23074) malloc: *** mmap(サイズ=1200001024) が失敗しました (エラーコード=12) *** エラー: リージョンを割り当てられません *** デバッグするために malloc_error_break にブレークポイントを設定します メモリ不足です。 $ perl -E 'my $x = "a" x 1100000000; print "ok\n"' わかった
仮想メモリを 100 億に設定しようとしましたが、役に立ちませんでした。
$ ulimit -v 10000000000 # 100 億 $ perl -E 'my $x = "a" x 1200000000; print "ok\n"' perl(24275) malloc: *** mmap(サイズ=1200001024) が失敗しました (エラーコード=12) *** エラー: リージョンを割り当てられません *** デバッグするために malloc_error_break にブレークポイントを設定します メモリ不足です。