12

VS2010C++のインデックスに最大3,000,000個のdouble値を格納したいと思います。unsigned int私はstd::tr1:unordered_map<unsigned int, double>この目的のためにを使用します。残念ながら、値番号2 ^ 21を格納しようとすると、例外がスローされます(2 ^ 21-1のスペースしかない場合、つまり、一部のインデックスでは20ビットしか使用できない場合があります)。値を保存する前に試しましたrehashが、どちらも機能しませんでした。

最後に、私はいくつかの非常に基本的なテストプログラムに行き着きました(少しでも異なる動作を示しましたが、とにかく):

    std::tr1::unordered_map<unsigned int, float> mapOut;
    //mapOut.rehash(SOMESIZE);
    for (unsigned int i=0; i<3000000; i++)
    {
        if (i%1000==0) std::cout << i << std::endl;
        mapOut[i] = 0.0;
    }

私がチェックしたいくつかのケース:

1)まったく再ハッシュしない場合、プログラムはi == 32000(最終的には2 ^ 15)に従って出力された後、長い休憩を取り、その後i == 262000(2 ^ 18)に進みます。そこでは永久に保持されます(100%のCPU負荷で、メモリは増加しません)。

2)を実行するrehash(1000)と、i == 65000(2 ^ 16)になり、永久に保持されます(CPU負荷は100%、メモリは増加しません)。

3)を実行するrehash(3000000)と、ループは正常に終了しますが、プログラムは終了しません。つまり、明らかにデストラクタに問題があります。

そこで何が起こっているのか、そしてさらに重要なのは、それについて何をすべきかということです。

助けてくれて本当にありがとうございます!

4

1 に答える 1

4

Connectの次のバグは、問題に関連しているようです。Visual C ++:std::unordered_mapデバッグ構成でのデストラクタのパフォーマンス

同じ問題は、デストラクタだけでなく、unordered_mapサイズが変更された場合にも発生します。イテレータのデバッグが有効になっている場合、イテレータを無効にすることと関係があるようです。

彼らはそれがVC11のために修正されたと言います。いくつかの回避策もリストされていますが、私はそれらを試していません。

デバッグビルドとリリースビルドの両方のパフォーマンスの問題を解決する非常に簡単な方法は_SECURE_SCL=0_HAS_ITERATOR_DEBUGGING=0プロジェクトオプションで[構成オプション/ C / C ++ /プリプロセッサ/プリプロセッサ定義]を設定することです。これにより、すべてのイテレータのデバッグが完全に無効になります。ただし、これにより一部のセキュリティチェックも無効になるため、独自のコードではさらに注意する必要があります。これらは両方ともリリースビルドのデフォルトであると私は信じているので、そこで何も変更する必要はありません。

これは、サンプルコードの問題に関連しているようです。どの例外がスローされたかを言わなかったので、元の問題についてはよくわかりません。

于 2011-07-28T13:55:22.550 に答える