2012-02-07 27 views
2

Visual Studio 2008(C++)でWin32アプリケーションを開発しました。それは、32ビットまたは64ビットのWindows 7でうまく動作します。しかし、時には非常に大きなメモリバッファ(アプリケーションが大量のデータを扱う)を割り当てる必要があり、Windows 7 64ビットで実行すると失敗します、32ビットでうまく動作します。大きなメモリバッファでは、1つは〜250MB、もう1つは〜150MBです。私は8GBのRAMを自分のPCにインストールしています。私の情報によると、64ビットOSは32ビットアプリケーションで4GBのavailablaを作っています。私はその限界近くにどこかが必要ですが、mallocは失敗します。 アイデアが何であり、何ができるのですか? ありがとうございます。Windows 7での32ビットC++アプリケーションの開発64ビット

+0

小さいブロックを割り当てて、それらをまとめて1つのより大きな仮想*ブロックを提示します。 –

+0

HeapCreateを使用しておらず、最大サイズを指定していませんか? –

答えて

1

150MB a 250MB以上は特に大きな予算ではありません。他の人が指摘しているように、あなたが打ち込んでいる問題は、アドレススペースの断片化が起こりやすいということです(十分な空き領域があります。他の提案に加えて

  • はすぐにプログラムが起動するように、メモリを割り当てます。アドレス空間は断片化される可能性が低くなります。プログラムの存続期間にこのような多くのメモリを割り当てるのが賢明でない場合は、VirtualAllocMEM_RESERVEフラグを指定してアドレス空間を予約し、後でコミットしてください。
  • プロセスが開始されると直ちにアドレス空間が断片化されるのは、おそらく役に立たない場所にロードされたDLLが原因であると考えられます。 VMMapを使用すると、アドレス空間で何が起きているのかを確認できます。あなたに属するDLLがアドレス空間を断片化している場合は、それらを再配置することができます。
+0

私は何かを変換するために必要なこれらの大きなバッファを最初にすべて割り当てることはできません。最後にはそれらを解放します。しかし断片化は理由の一つかもしれません。 DLLをリベースするにはどうすればよいですか?ありがとう。 – aronsatie

+0

私が言ったように、VirtualAllocを使ってメモリを実際に割り当てることなく、アドレス空間を予約することができます。とにかく 'link/BASE'オプションでDLLベースアドレスを設定することができます。これは、高度なリンカオプションの下でVSに表示されます。あるいは 'editbin/REBASE'を使って既存のDLLを変更することができます。 – arx

1

Win32バイナリに仮想アドレス空間の制限があります。制限はmight be 2 to 4 GB depending on OS and environmentです。割り当ての断片化のために実際の制限は少なくなります。ライブスペース内

  • あなたが効果的にマッピング解除/再マッピングブロックを可能にするのx64へ
  • 移動
  • 使用する複数のプロセス
  • 使用のメモリ割り当てAPIを割り当てることができます。

    選択肢がにありますアプリケーションの仮想アドレス空間については、File Mappings: Virtual Memory and Virtual Address Spaceを参照してください。

+0

私はx64版を持っていますが、もちろんそれは私に同じ問題を与えませんが、私はx86版も保ちたいと思います。何らかの理由で、32ビットWin7を搭載したx86アプリケーションの方が、64ビットWin7よりもメモリ管理が効果的です。 – aronsatie

+0

'/ LARGEADDRESSAWARE'オプションを使って' Win32'バイナリをコンパイルすると、アプリケーションは64ビットOSで* way *の方がすぐに動作するようになります。元の2 GBと最大値に比べてすぐに4 GBを受け取るでしょう32ビットシステムでは3 GBまで可能です。 –

+0

それは私が思ったものです。私はLargeaddressawareでコンパイルしますが、私は32ビットOSよりもすぐにメモリ不足になります。 (正直なところ、私は64ビットWin7と32ビットXPを比較したので、あまりよく分かりません)。 – aronsatie

-1

win7-64の下にmallocにバグがあると思います。 XP32、w7-32、win7-64の3つのマシンで、私の32ビットアプリケーションで同じテストを実行しました。 32ビットプラットフォームでは正常に動作しますが、w7-64では110Mbのブロックを割り当てられません。私は私のドライブをデフラグメントして、同じ結果でクリーンな再起動から再試行しました。

k

+1

ドライブを最適化すると、 'malloc'経由でさらに多くのメモリを割り当てることができます。どのコンパイラ? OPは彼がVS2K8を使用していると言っていますが、そのような主張はしません。 –

+0

私はSilverfrostのFTN95コンパイラと内部的に "GET_STORAGE"関数を使用しています。これは明らかにGlobalAllocを呼び出しています(謝罪 - mallocと直接呼ばれていると思いました)。成功するために仮想メモリに十分な連続スペースがない場合に備えて、私はドライブをデフラグしました。 – KennyT

+0

(a)mallocは、GlobalAllocまたは同等のものを呼び出します。 (b)仮想メモリがそのように動作しない場合、ファイルがディスク上で連続しているかどうかに違いはありません。 –

関連する問題