HeapAllocで大容量確保したい。 – プログラミング – Home

HeapAllocで大容量確保したい。
 
通知
すべてクリア

HeapAllocで大容量確保したい。


よっしぃ
 よっしぃ
(@よっしぃ)
ゲスト
結合: 16年前
投稿: 10
Topic starter  

大型のヒープメモリーを確保したいのですが、
708MB付近で、確保に失敗するようになります。(NULLを返すようになります。)

m_hHeap = HeapCreate(0,0,0);
m_mom = (LPSTR)HeapAlloc(m_hHeap,HEAP_ZERO_MEMORY,708000000L);

1GBくらい確保したいのですが、可能でしょうか。

環境は、WindowsXp(x86) RAM3GB
開発 Visual C++2005

よろしくお願いします。


引用解決済
トピックタグ
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

むりでしょう。
素直に x64 に乗り換えることをお勧めしますな。

そんな大量の連続メモリを必要としないように書き換えるほうが解決が早いとみた。


返信引用
よっしぃ
 よっしぃ
(@よっしぃ)
ゲスト
結合: 16年前
投稿: 10
Topic starter  

やはり。

ちなみに、707MBって何なのでしょう?
SIZE_T のMAX値よりも小さい気もしますが?


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 18年前
投稿: 178
 

>ちなみに、707MBって何なのでしょう?

たまたま、連続領域で開いていたのが707Mだった…ということでは?
プロセス空間内のいろいろなところにDLLが読み込まれたりしますし。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> たまたま、連続領域で開いていたのが707Mだった…ということでは?
> プロセス空間内のいろいろなところにDLLが読み込まれたりしますし。

多分そうですね。
他のアプリ機動前、DLLの読み出し前に確保すると、もっと取れるかも知れません。
更にDLLのロードアドレスを再配置しておくのも手かも知れません。
但し、環境次第では普通に失敗すると思います。
メモリがあいてるかどうかよりも、メモリ空間(連続したアドレス)があいてるかの方が重
要で、
大抵1GB以下で確保失敗することになるわけです。
# 一般論で言えば100MB×10の方が取れる可能性は高いはず。

で、tetrapodさんの提案のいずれかを考えるのが正攻法。
> 素直に x64 に乗り換えることをお勧めしますな。
> そんな大量の連続メモリを必要としないように書き換えるほうが解決が早いとみた。


返信引用
よっしぃ
 よっしぃ
(@よっしぃ)
ゲスト
結合: 16年前
投稿: 10
Topic starter  

よくわかりました。
ありがとうございます。
参考になります。

ちなみに、x64 のほうが、メモリ空間自体が広いので、連続したアドレスが空いている
可能性が高いということでしょうか。

また、ちょっとコードに関する疑問なのですが、
メモリを2つ確保するとき
m_hHeap = HeapCreate(0,0,0);
m_mom[0] = (LPSTR)HeapAlloc(m_hHeap,HEAP_ZERO_MEMORY,10000L);
m_mom[1] = (LPSTR)HeapAlloc(m_hHeap,HEAP_ZERO_MEMORY,10000L);

m_hHeap[0] = HeapCreate(0,0,0);
m_hHeap[1] = HeapCreate(0,0,0);
m_mom[0] = (LPSTR)HeapAlloc(m_hHeap[0],HEAP_ZERO_MEMORY,10000L);
m_mom[1] = (LPSTR)HeapAlloc(m_hHeap[1],HEAP_ZERO_MEMORY,10000L);
は動作違いますか?


返信引用
金魚ちゃん
 金魚ちゃん
(@金魚ちゃん)
ゲスト
結合: 16年前
投稿: 52
 

>は動作違いますか?
はい違います。

前者は1つのヒープ管理領域から2つのメモリを確保。
後者は2つのヒープ管理領域から1つのメモリをそれぞれ確保。


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

GUI を持つアプリだと MFC**.DLL とかいろんなものがロードされる関係で
「空き連続アドレス空間」は小さくなっているのが普通。
「空きメモリ」があっても「空き連続アドレス空間」が無いならば、
100MB サイズの連続メモリ領域を10個取る(合計1GB)のは可能であっても、
1GB サイズの連続メモリ領域を1個取る、ことはできない、ってのはごく普通。

計算アルゴリズムの変更などで大量連続メモリを使わないようするのが
結果的に早い(メモリの少ないマシン等でもうごくようになるわけだし)
それがどうしても無理なら、大量連続メモリを確保する実験してるページ紹介
http://www.marbacka.net/asm64/arkiv/64bit_addressing.html
どのくらい「空き連続アドレス空間」があるかも調べられるよ


返信引用
よっしぃ
 よっしぃ
(@よっしぃ)
ゲスト
結合: 16年前
投稿: 10
Topic starter  

みなさん、ありがとうございます。
感謝です。

>前者は1つのヒープ管理領域から2つのメモリを確保。
>後者は2つのヒープ管理領域から1つのメモリをそれぞれ確保。

どのように使い分ければよいのでしょうか?

いままで、何も考えずに、
>後者は2つのヒープ管理領域から1つのメモリをそれぞれ確保。
を使用していましたが、最近、
>前者は1つのヒープ管理領域から2つのメモリを確保。
こうかかれている、ソースを見ました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました