|
詳細なご説明ありがとうございます。
> だけどあなたが気にするべきはこっちぢゃなくて後者で > 64bit Windows でも x86 アプリなら、1つのアプリが使えるメモリ=仮想アドレス空間は 2GiB
質問文でお聞きした通り、2GiBが上限なのは分かっています。
> この 2GiB 中に EXE や DLL がロードされる都合上、一般的に x86 アプリがデータに使えるのは 1GiB 無いのが普通っす。 > オイラが言っている「分断化された」うんぬんもプロセス内仮想アドレス空間の使用未使用の話。
ここをお聞きしたかったのですが、 EXEファイルのサイズは1MB程度でDLLは一切使用していません。 となると、2GiBまるごと使えるのでしょうか? ここがどの程度まで使えるかを調べるためのコードを知りたいのです
> 配列は「連続したメモリ」を取る代物なので提示コードのように Redim を繰り返すのは悪手で、 > 最悪パターン時、元領域 512MiB + `新領域 512MiB となってメモリ空間が 1GiB 空いていても 512MiB しか使えないっす。
ここは理解できていません。 Redimを繰り返すと半分のメモリー容量しか使えないのはなぜですか? 繰り返すのではなく Dim Array(MaxNum,1000,1000) のようにして、一度に宣言すればまるごと使えるという意味ですか? もっと良い方法があればお教えください。
> 案件が「スラッシングしてでも計算できること」なのか「スラッシングしない範囲で計算したい」のかで話はちがってきて
スラッシングしない範囲で計算したいというのがご回答です。
> 後者なら先の dobon さんとこの AvailablePhysicalMemory を使うといいかもしれない。 > オイラなら max(AvailablePhysicalMemory, 1GiB) を使ってみるかな・・・
AvailablePhysicalMemoryは既に使っているのですが、 上で述べた通りコレはOS全体の3 or 4GBを上限とした使用可能なメモリー容量であって いま知りたい起動しているプログラムのメモリ容量ではないので、 大丈夫かと心配になっています。
|