メモリ アドレス空間を拡張(2GB以上)するには?


さばかん  2018-02-09 04:04:45  No: 48985

お世話になります、Delphiは初めて使用しております。

Delphiでメモリを2G以上使用する方法を教えて下さい。

・使用環境
Windows10 64bit
Embarcadero® Delphi 10.2

上記環境で2GB以上の配列を確保したいのですが、以下のエラーとなります。
「E2100 型が大きすぎます : 2 GB を超えました」

以下URLを参考にdprファイルに「{$SetPEFlags $0020}」を追加したのですが
状況は変わりませんでした。

http://docwiki.embarcadero.com/RADStudio/Berlin/ja/%E3%83%A1%E3%83%A2%E3%83%AA_%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E7%A9%BA%E9%96%93%E3%82%92%E6%8B%A1%E5%BC%B5%E3%81%99%E3%82%8B

追記の仕方が悪いのでしょうか?
以下はdprファイルの内容です。

program Project1;

{$SetPEFlags $0020}
uses
  Windows,
  Vcl.Forms,
  Unit1 in 'Unit1.pas'{Form1};

{$R *.res}

begin

  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

宜しくお願い致します。


Mr.XRAY  2018-02-09 08:50:45  No: 48986

取りあえずコマンドプロンプトで bcdedit を実行してみて,3 GB までが有効になっているか確認してみてはどうでしょう. 
有効になっていれば increaseuserva 3072 というのがあるらしいです.
もちろん,私の Windows 7 ( 64 bit) ではこの項目は表示されません.

ただ,多分 3 GB までを有効にしても,2 GB の配列は無理かも知れません.


Mr.XRAY  2018-02-09 09:07:06  No: 48987

>ただ,多分 3 GB までを有効にしても,2 GB の配列は無理かも知れません.

この 2GB が要素数を意味しているのであれば確実に無理です.
配列の要素のインデックスは Integer 型です.
32 ビットの EXE の Integer 型は 32 ビット,つまり,2 GB です.
( インデックスは正の値を使用します )


さばかん  2018-02-09 17:52:40  No: 48988

Mr.XRAYさん
御返信ありがとうございます、助かります。

配列としてはLongint型で以下のように取得しようとしておりました。
TEST=ARRAY[0..30000,0..30000] OF LONGINT;

教えて頂いたコマンドを叩いた所、該当のパラメータはありませんでした。
OSは64bitなのですが、その場合もこのパラメータは有効にする必要がありますでしょうか?
知識不足で申し訳ありません、もう少し調べてみます。


take  2018-02-09 18:33:37  No: 48989

どのような処理を行おうとしているのかわかりませんが
例え2G以上の配列を確保できたとしても
処理に時間がかかりすぎるのでは無いでしょうか?

何かしらの大きなサイズのファイルを読み込んで処理するのであれば
分割して読み込んでいくとか出来ますし


Mr.XRAY  2018-02-09 20:18:50  No: 48990

>OSは64bitなのですが、その場合もこのパラメータは有効にする必要がありますでしょうか? 

32 ビットの EXE でメモリのアドレス空間を 3 GB にできるのは 64 ビットの Windows 上でだけです.
で,3 GB に拡張するためには,

(1) OS に 3 GB に拡張するためのコマンドを実行する
(2) 作成するアプリに必要な設定を行う

(1), (2) 共にさばかんが提示されたページに書いてあります.

既にレスがあるように,巨大配列を処理する方法として,分割処理があります.
これは昔から使われている方法です.
かっては私もそうしていました.


Mr.XRAY  2018-02-09 22:12:48  No: 48991

ゴメンなさい.

3 GB --> 4 GB

ですね.


さばかん  2018-02-09 22:30:23  No: 48992

takeさん
Mr.XRAYさん
ご回答ありがとうございます。

既存アプリの改修で読込むデータ量が大幅に増える事になり
配列の拡張だけでどうにかならないか検討していました。

教えて頂いたパラメータを有効にしてみましたがコンパイルは通りませんでした。

お二人の仰る通り処理を見直す方向で検討したいと思います。
色々とコメント頂きありがとうございました。


Mr.XRAY  2018-02-10 00:19:56  No: 48993

30000 x 30000 x 8 = 7200000000 (7.2 GB)
どう考えても無理があると思いますが...


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加