問題タブ [boost-bimap]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ブーストバイマップでメモリテイクを見つける方法
私はboost bimap
私は約180000000のエントリを持っています。理論的には ~2.7GB のスペースが必要です (180000000*8*2 = 2880000000 バイト = 2880000000/ 1024*1024*1024 = ~2.7GB )。が実際に占めるスペースを見つけたいのですがboost bimap
、どうすればそれを行うことができますか。
c++ - ブースト バイマップは多くのメモリを消費します
これを調べましたが、役に立ちませんでした。
boost bimap
の 100 万件のエントリがある場所がありますlong long int
。理論的には、1000000*8*2 バイト = 16 MB のメモリが必要です。しかし、使用されたメモリの合計は 73 MB であることがわかりました。何が問題なのかわかりません。
次にコード例を示します。
main.cpp
index.cpp
index.h
libboost-all-dev 情報
c++ - 効率的な方法で boost::bimap を作成、アクセス、保存、ロードする
以前の質問の続きとして、ビットセットをシリアル化して、同じデータに対して bimap を繰り返し作成しないようにするため、必要に応じて bimap を保存してロードします。
ハッシュ技術を使用し、検索に O(1) 操作が必要なため、データ (ビットセット) をペアでboost::bimap
格納することにしました。<key,value>
にはbimap
4,000 万のビットセット エントリがあり、次の操作を実行する場合があります。
最小限の時間でビットセットを挿入し
bimap
ます。私の以前の質問への回答には、より多くの時間がかかります( 2で指定されたハッシュ関数と比較すると、5 倍の 2500 万ビットセット エントリで約 5 秒)。同じ理由unordered_set_of
で andunordered_multiset_of
が使用されます。
/li>bimap
以下のハッシュ関数とは異なり、できるだけメモリの消費を抑えてコピーを避けたい。O(1) キー/値を検索します。
短時間でバイマップを読み込みます。繰り返しになりますが、bimap のロードにはかなりの時間がかかります(25 万エントリの bimap、サイズ 12 MB の場合、約 20 秒)。
したがって、回答コード@seheが以下に示されている、すでに尋ねられた質問に対して1、2、3、および4を達成したいと考えています。
編集
AIM
私は、たとえば2000万文字以上の大きな文字列と、長さ200文字以上の4000万から1億文字の短い文字列がある実際の例を持っています。私の目的は、これらの短い文字列を大きな文字列で検索することです。大きな文字列のビットセットを作成してからbimap
、バイマップで短い文字列を検索することを考えました。unordered
とは異なり、挿入と検索を非常に高速に行うために使用することも考えましたordered
。
キー ビットセットの長さは 3 ~ 40 程度です (一度にすべての組み合わせ)。
値のビットセットの長さは約 100 ~ 2000 です (たとえば、100 の場合は一度に 1 つだけです。すべての値のエントリは約 90 ~ 110 程度になります)。
c++ - ビュー値の反対側とは異なるキーを持つビューの片側で C++ bimap は可能ですか? どうやってするか?
最初はマップが必要だったので、std::map を使用しました。
次に、いくつかの要件が追加され、「値」の「キー」(バーの foos)も取得する必要があったため、使用しました
その後、さらにいくつかの要件が追加されたため、すべての foo の番号を保存する必要があり、右側のビューから<bimap>.righ.find(bar)
(foo + foo に保存されている番号) のペアを呼び出して取得できるようにする必要がありますが、それでも呼び出し<bimap>.left.find(foo)
てバーを取得できるようにしたい。
それを達成する方法は?可能であれば、ブーストよりも最新の C++ を使用したいと思いますが、ブーストなしでバイマップ機能を使用するのは難しいと思います。
編集:サイズが重要であることに注意する必要があるため、関連する部分を2回保存したくなく、速度も重要です。
"foo1"+100 <-> "bar1"
と
のようなものが必要"foo2"+300 <-> "bar4"
です。そして、「bar1」
を呼び出して取得できるようにしたいだけで
なく、ペア(「foo1」、100)も取得できるようにしたいと考えています。<bimap>.left.find("foo1")
<bimap>.right.find("bar1")