3

stdext ハッシュマップに関連する非常に奇妙なことに直面しました。多くのオブジェクトを扱う必要があり、要素にすばやくアクセスすることが優先されます。私のプログラムはファイルからオブジェクト値を読み取り、それが新しい要素の場合は、この値をハッシュマップに挿入し、既に処理されたオブジェクトの場合は、ハッシュマップに格納されている値を変更します。

私の問題はに関連していhashmap(stdext)ます。このコンテナの初期化オプションが見つかりません。

キー要素は符号なし整数 ( uint64) であり、そのオブジェクトはこのキーを使用してハッシュマップに格納され、サイズは 160 KB です。
プログラムは動作していますが、hashmap 内のオブジェクトの数が制限に達すると、あまりにも待たなければなりません。

この後、期待どおり、ハッシュマップは再び正常に機能しています。多分それは再編成のステップだと思いました。

ただし、これらの手順は重要です。通常の処理手順は約 2 ~ 3 分ですが、特定の数のオブジェクトを処理した後、この手順を実行するには 5 時間かかります。この後、処理は「通常」になります。

誰もそのような問題に直面しましたか?このハッシュマップについてもっと詳しいことを知っている人はいますか? このトピックに関連するものは見つかりませんでした。


ハッシュマップ パラメータをデフォルト以外の値で使用しようとしています:bucket_sizeおよびmin_buckets. このデフォルト値はbucket_size=4min_buckets=8です。これらの値をコードから変更できなかったため、xhash ファイルでそれらをより大きな値に変更しました。私のアプリケーションではそれが重要だと思いますmin_buckets。再編成のステップを避けて、より良いパフォーマンスを得るために「微調整」しようとしています。

しかし、別の問題が発生したため、ハッシュマップをクリアしようとするまで、すべてが正常に機能します。時間がかかります。デフォルト値で使用すると、非常に高速に実行されます。

xhashファイルを変更するのは悪いステップでしたか? 以前にデフォルト以外の値を使用した人はいますか? この遅いクリアの理由は何ですか?

2 番目の質問は、ハッシュマップにポインターを格納することに関するものです。アイデアは明らかですが、ポイントされたメモリを解放するにはどうすればよいでしょうか。オブジェクトへのポインターを作成する必要があります。これらのポインターはハッシュマップに格納され、値が必要な場合は、このポインターを逆参照することができます。しかし、マップを保存した後、どうすればメモリをクリアできますか? 些細な質問かもしれませんが、今は解決策がわかりません。

すでに投稿された回答に感謝します。

4

4 に答える 4

3

オブジェクトのコピーはおそらく非常にコストがかかります (そのサイズを考えると)。オブジェクト全体ではなく、オブジェクトへのポインターを保存するか、削除を簡単にしたい場合は boost::shared_ptr を保存してみてください。

このようにして、データ構造が再編成されると、巨大なオブジェクトをコピーするために必要だったものではなく、単なるポインターの割り当てであるため、コピーは非常に高速になります。

于 2009-02-24T19:36:57.167 に答える
0

Javaを使用します。効率的なハッシュマップの挿入(より優れたアロケータ、コピーなし)に関しては、C ++を打ち負かし、ルックアップで一致させる順序に驚かれることでしょう。

于 2009-07-03T18:56:07.020 に答える
0

あなたの問題は、再割り当て(およびコピー)またはハッシュ衝突のいずれかの問題です。

ベクトルはこれに非常に苦しんでいます(そして、指数関数的に増加する割り当てサイズを持っています)。ただし、マップ、セット、およびハッシュマップは通常、それほど影響を受けません。これらの後者のクラスには、ほとんどの場合、resize()メンバーがありません。それで、

  • カスタムアロケータを渡すことができます(ほとんどのコンテナでAFAIKが許可されています)
  • より良いハッシュアルゴリズムを選択してください

必要に応じて、ハッシュマップの実装をチェックして、それらがmove-idiomに従っているかどうかを確認できます。彼らがそれに打撃を与えないならば。

于 2009-02-24T20:18:43.323 に答える
0

コンテナがより多くのオブジェクトにスペースを割り当てることを決定したときに、オブジェクトをコピーするコストに見舞われているようです。最も単純な 2 つのオプションは次のとおりです。

  1. void resize(size_type n)関数を使用して挿入するオブジェクトの数がわかっている場合。

  2. オブジェクト自体ではなく、コンテナーにポインターを格納できます。

于 2009-02-24T19:42:04.113 に答える