問題タブ [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.

0 投票する
1 に答える
173 参照

c++ - ブーストバイマップでメモリテイクを見つける方法

私はboost bimap

私は約180000000のエントリを持っています。理論的には ~2.7GB のスペースが必要です (180000000*8*2 = 2880000000 バイト = 2880000000/ 1024*1024*1024 = ~2.7GB )。が実際に占めるスペースを見つけたいのですがboost bimap、どうすればそれを行うことができますか。

0 投票する
0 に答える
381 参照

c++ - ブースト バイマップは多くのメモリを消費します

これを調べましが、役に立ちませんでした。

boost bimapの 100 万件のエントリがある場所がありますlong long int。理論的には、1000000*8*2 バイト = 16 MB のメモリが必要です。しかし、使用されたメモリの合計は 73 MB であることがわかりました。何が問題なのかわかりません。

次にコード例を示します。

main.cpp

index.cpp

index.h

libboost-all-dev 情報

0 投票する
1 に答える
238 参照

c++ - 効率的な方法で boost::bimap を作成、アクセス、保存、ロードする

以前の質問の続きとして、ビットセットをシリアル化して、同じデータに対して bimap を繰り返し作成しないようにするため、必要に応じて bimap を保存してロードします。

ハッシュ技術を使用し、検索に O(1) 操作が必要なため、データ (ビットセット) をペアでboost::bimap格納することにしました。<key,value>にはbimap4,000 万のビットセット エントリがあり、次の操作を実行する場合があります。

  1. 最小限の時間でビットセットを挿入しbimapます。私の以前の質問への回答には、より多くの時間がかかります( 2で指定されたハッシュ関数と比較すると、5 倍の 2500 万ビットセット エントリで約 5 秒)。同じ理由unordered_set_ofで andunordered_multiset_ofが使用されます。

  2. bimap以下のハッシュ関数とは異なり、できるだけメモリの消費を抑えてコピーを避けたい。

    /li>
  3. O(1) キー/値を検索します。

  4. 短時間でバイマップを読み込みます。繰り返しになりますが、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 程度になります)。

0 投票する
1 に答える
221 参照

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")