アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下プログラムは32GBほどメモリを積んでいるPCで実行してもOut of memory!と表示されて落ちます。おそらく、配列が多すぎるのだと思いますが、配列に入れられる数を増やすことはできないのでしょうか?
ちなみに、一桁少ない数だと1秒位で正常終了します。

use strict;
use warnings;

my @all;
for(1..100000000){ #10000000なら問題なく終了する
push(@all,$_);
}
open( FT, ">test.txt" );
print FT join "\n", @all;
print FT "\n";
close FT;

質問者からの補足コメント

  • バージョンにつきまして

    Perl -v
    This is perl 5, version 28, subversion 2 (v5.28.2) built for MSWin32-x86-multi-thread-64int
    Copyright 1987-2019, Larry Wall

    OS Windows 10 64bit

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/02/16 17:20
  • たくさんの回答をいただきありがとうございます。
    64ビット版を使っていると思いこんでいました。
    また、当方ではすぐに試せない環境なので、実際に試してくださる方がおられ本当に助かりました。
    64ビット版の導入を考えようと思います。

      補足日時:2022/02/17 16:29

A 回答 (5件)

32ビットのperlの場合


D:\goo\perl>H:\perl\32\perl\bin\perl.exe -v
This is perl 5, version 28, subversion 2 (v5.28.2) built for MSWin32-x86-multi-thread-64int

64ビットのperlの場合
D:\goo\perl>H:\perl\64\perl\bin\perl.exe -v
This is perl 5, version 28, subversion 2 (v5.28.2) built for MSWin32-x64-multi-thread



32ビットの場合、
MSWin32-x86-multi-thread-64int
と表示されますが、64ビット版ということではなさそうですね。
あなたが使用されているのは、32ビット版かと。


ちなみに、こちらで
上記の32ビット版で、当該スクリプトを実行すると、Out of memory! となり
64ビット版で、実行すると正常終了します。
    • good
    • 0

MSWin32-x86-multi-thread-64int


x86が32ビットアーキテクチャ
x64が64ビットアーキテクチャ
を表しています。
32ビットの場合、扱えるメモリは4GBまでです。

64intは、int型(整数)のデータが64ビットに対応している意味かと思われます。
    • good
    • 0

64ビット版のperlを使用すれば解決しますが、


現行のperlを使用して解決したい場合です。
前提として、test.txtを作成するのが目的の場合です。
(配列に入れられる数を増やすことが目的ではない)
10回に分けて、出力を行えば良いかと。
1回目 1~10000000
2回目 10000001~20000000
・・以降同様

以下、サンプルスクリプトです。
use strict;
use warnings;
sub print_out{
my($st,$en) = @_;
my @all;
for($st..$en){ #10000000なら問題なく終了する
push(@all,$_);
}
print FT join "\n", @all;
print FT "\n";
}

open( FT, ">test.txt" );
for (my $i = 1; $i <= 10; $i++){
print_out(($i-1)*10000000+1,$i*10000000);
}
close FT;
    • good
    • 0

手元の Strawberry Perl for Windows 5.32.0 では動いてる. タスクマネージャーで調べると 5 GB くらい使ってるので, 64ビットじゃないと動かないと思う.



書き方がちょっと古いってのはさておき.
    • good
    • 0

こちらで、そのスクリプトを実行しました。


正常に終了しました。
32ビット版のperlを使用されていないでしょうか。

こちらで使用したStrawberry Perl for Windows のバージョンです。
perl -v
This is perl 5, version 32, subversion 1 (v5.32.1) built for MSWin32-x64-multi-thread
Copyright 1987-2021, Larry Wall

ちなみに当方のマシンのメモリは12GBです。
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!