4

私は Qt を初めて使用し、いくつかの大きなファイルを読み込んで処理する必要があります。代わりに、メモリが不足しています。次のコードは、私の問題を示しています。

QByteArray mem;
for(int i=1; i<=20; ++i)
{
    std::cout << "eating " << (i * 100) << "MB";
    mem.resize(i * 100 * 1024 * 1024);
}

600MB に達すると、std::bad_alloc を取得しています。そんなことは本当にあってはならないことです。ヒープサイズを増やすための秘密のスイッチはありますか?

Windows で Qt 5.0.2 と Visual C++ 10.0 x86 コンパイラを使用しています。

4

2 に答える 2

2

Windows では、32 ビット プロセスは 2 GB のヒープ メモリを持つことができます。このメモリに Bytearray を処理するのに十分な大きさの連続したブロックが含まれていない場合、不適切な割り当て例外が発生します。

MSVCは/LARGEADDRESSAWARE (Handle Large Addresses)および/HEAP (Set Heap Size)リンカー オプションを認識します。

それらを変更すると、一度に割り当てることができるバイト数に影響するかどうかを確認できます。

私の x64 マシンでは、MSVC2012 で /MACHINE:X86 でコンパイルされた実行可能ファイルが、1200MB 以上の単一の割り当てに対して不正な割り当て例外をスローします。

リンカー コマンド ラインに追加/LARGEADDRESSAWAREすると、プログラムはクラッシュするまで継続しeating 2100MBます。

代わりに /MACHINE:X64 を使用してコンパイルすると、プロセスは例外なく 8000MB にブロックを割り当てます (おそらくそれ以上ですが、私は 8GB までしかテストしませんでした)。

于 2013-06-22T00:23:57.350 に答える