問題タブ [leveldb]
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++ - 文字列の数値を増やす
増加する ID をキーとして levelDB データベースに保存する必要があります。したがって、得られるもの (および levelDB に渡さなければならないもの) は文字列です。
質問: 文字列に保存された数値を増やすエレガントな方法はありますか?
例:
乾杯!
PS: 標準のコンパイル、つまり C++11 を使用しないことを希望します。
database - LevelDBの場合、要求された「公式」パフォーマンスレポートと同じようにランダム書き込みのパフォーマンスを取得するにはどうすればよいですか?
leveldb(http://code.google.com/p/leveldb/)の公式サイトの1つに、パフォーマンスレポートがあります。以下のように貼り付けました。
以下は公式のleveldbベンチマークからのものです
これは、含まれているdb_benchプログラムの実行からのパフォーマンスレポート(説明付き)です。結果はややうるさいですが、球場のパフォーマンスの見積もりを得るには十分なはずです。
設定
100万エントリのデータベースを使用しています。各エントリには、16バイトのキーと100バイトの値があります。ベンチマークで使用される値は、元のサイズの約半分に圧縮されます。LevelDB:バージョン1.1
CPU:4 x Intel(R)Core(TM)2 Quad CPU Q6600 @ 2.40GHz
CPUキャッシュ:4096 KB
キー:各16バイト
値:各100バイト(圧縮後50バイト)
エントリー:1000000
生のサイズ:110.6 MB(推定)
ファイルサイズ:62.9 MB(推定)
書き込みパフォーマンス
「塗りつぶし」ベンチマークは、新しいデータベースを順次またはランダムな順序で作成します。
「fillsync」ベンチマークは、すべての操作の後にオペレーティングシステムからディスクにデータをフラッシュします。他の書き込み操作では、データはしばらくの間オペレーティングシステムのバッファキャッシュに残ります。「上書き」ベンチマークは、データベース内の既存のキーを更新するランダム書き込みを実行します。
fillseq:1.765 micros / op; 62.7 MB / s
fillsync:268.409 micros / op; 0.4 MB / s(10000 ops)
fillrandom:2.460 micros / op; 45.0 MB / s
上書き:2.380マイクロ/操作; 46.5 MB / s
上記の各「op」は、単一のキー/値ペアの書き込みに対応します。つまり、ランダム書き込みベンチマークは、1秒あたり約400,000回の書き込みになります。
以下は私のleveldbベンチマークからのものです
leveldbのベンチマークを実行しましたが、書き込み速度はレポートの100分の1になりました。
これが私の実験設定です:
- CPU:Intel Core2 Duo T6670 2.20GHz
- 3.0GBメモリ
- 32ビットWindows7
- 圧縮なし
- options.write_buffer_size = 100MB
- options.block_cache = 640MB
私がしたことは非常に単純です。200万の{key、value}を入力するだけで、読み取りはまったく行われません。キーは20個のランダムバイトを持つバイト配列であり、値も100個のランダムバイトを持つバイト配列です。私は常に新しくランダムな{key、value}を200万回、他の操作なしで配置します。
私の実験では、最初から書き込み速度が低下していることがわかります。瞬時速度(1024書き込みごとの速度を測定)は、50/sから10,000/sの間で変動します。そして、200万ペアの書き込みの全体的な平均速度は約3,000/秒です。書き込みのピーク速度は10,000/秒です。
レポートによると、書き込み速度は400、000 / sになる可能性があるため、ベンチマークの書き込み速度は40〜130倍遅くなり、ベンチマークの何が問題になっているのか疑問に思っています。
テストコードをここに貼り付ける必要はありません。非常に簡単です。whileループが200万回あり、ループ内では、反復ごとに20バイトのキーと100バイトの値が生成されます。 、次にそれらをleveldbデータベースに配置します。{key、value}の生成に費やされた時間も測定しました。コストは0ミリ秒です。
誰かがこれを手伝ってくれますか?leveldbで400、000 / sの書き込み速度を達成するにはどうすればよいですか?どの設定に改善する必要がありますか?
ありがとう
さらに
machieで公式のdb_bench.ccを実行しました。レポートより28倍遅いです。
私は彼ら自身のベンチマークプログラムを使用したので、私のベンチマークと彼らのベンチマークの唯一の違いはマシンだと思います。
c++ - 文字列(substrから)からunsignedintへの変換
たとえば、実際に数字と、で区切られた文字列を含む文字列があり,
ます"12,fooBar"
。
私はそれを分離された変数に入れたいと思います。つまり、数をunsigned int myNum
に、文字列をに入れたいのstd::string myStr
です。
私は次のコードを切り取っています:
これにより、が得られ12 and 1
ます。ここで見逃したことはありますか?2
第二部で何が起こったのですか?
注:私はこの問題をこのコードの一部に限定しました。を取得するには、c_str()
に渡す必要があります。ここでは、2番目の部分を印刷したくありません。atoi
unsigend int
更新:私は実際にlevelDBから文字列を取得しますGet
。ここに置いたようなテスト文字列を入れれば、うまくいきます。
stream - ストリームから leveldb をロードしています
データストリームから leveldb ストアをロードする方法はありますか?
leveldb インスタンスのストリームをマニフェスト リソース ストリームとして DLL に入れる場合、後で DLL からマニフェスト リソースを取得するときに、そのストリームからその db をロードする方法はありますか? 基本的に、ディスク上の物理ファイルに書き込むことなく、leveldb を構築、保存、および後でロードする方法を探しています。
有益な情報をお寄せいただきありがとうございます。ラジャ。
sqlite - > Java から使用される 1 秒あたり 60K のキー値ストアの挿入
毎秒 60K レコードの速度で巨大なデータをファイル/データベースに保存する必要があるカスタム ソリューションに取り組んでいます。このデータは、着信連続ストリームの結果です。
leveldb - 複数の Java プロセスから同時にアクセスすることはできません
berkleydb/kyoto Cabinet : 禁止されている商用ライセンス
sqlite : sqlite4java を試してみましたが、一括操作をサポートしておらず、必要な速度で実行されていません。また、jdbc ラッパー (http://www.zentus.com/sqlitejdbc/) も試しましたが、これも必要な速度で実行されません。
データを db/file にダンプし、複数のプロセス (+スレッド) からアクセスできるようにするソリューションを提案してもらえますか?
database - LevelDB ダウンロードの問題
空だとわかったので、Java-Windows用のLevelDBをダウンロードできる場所から誰か助けてもらえますか? また、インストールと実行の方法に関するリンクは、私にとって役に立ちます。
iterator - LevelDB:キープレフィックスで列挙するイテレータの実装
leveldbを使用してキープレフィックスで反復するキー列挙子を実装する効率的な方法を探しています。キーはバイト配列であり(dbはデフォルトのバイト配列比較子を使用するため、特定のプレフィックスを持つすべてのキーが順番に格納/取得されます)、イテレーターがキープレフィックスを取得し、それを持つキーを持つデータのみを返すことができるようにしたいと思いますプレフィックス。
デフォルトのdbイテレータを使用または継承し、範囲内の最初のキーを探し(もちろん、それが何であるかを知る必要があります)、プレフィックスで始まるすべてのスライスを検証して返す必要がありますか(movenextなどをオーバーライドします) )?または、これを実装するためのより効率的な方法はありますか?
誰かがすでにこれを解決していて、コードまたは一般的なアイデアを共有できるかどうかを教えてください。私はこれをC++/ CLIから試していますが、どの言語での実装でも役に立ちます。
ありがとう。-raj。
go - GoでLevelDBを使用する方法は?
http://code.google.com/p/leveldb/から、GoでLevelDBを使用することは明示的または簡単ではないようです。しかし、私は本当にGoでそれを使用する方法を知りたいです。
誰かが私に手がかりを与えることができますか?
open-source - cassandraまたはhbaseからleveldbタイプのデータストア(sstable + memtable)を抽出する方法は?
LevelDB は、Google の非常に興味深い C++ データ ストアです。私はJavaの世界で似たようなものを探しています(率直に言って、コードをよりよく理解し、Windowsでより簡単に実行できるようにするためです)。
HbaseとCassandraにも同じ基本技術が含まれていることを理解しています.ファイルストア用のsstable、メモリ内ストア用のmemtable(ソートされてディスクに書き込まれる前)、ある種の圧縮、定期的な圧縮などです。
大規模なプロジェクトからこの技術を引き出す努力はありますか? 私は自分自身 (主に Cassandra) のコード ベースを見始めましたが、これらは明らかに些細なプロジェクトではありません。モジュラー コードが多いのはどのプロジェクトですか?
ポインタを楽しみにしています!
leveldb - 値が空白でキーしかない場合、leveldb に構造的な問題がありますか?
私は、データのセカンダリ インデックスがキー内のすべての情報を使用して構築され、値側には何も必要としない設計に取り組んでいます。これは問題を引き起こす可能性がありますか?
空白の値を持つことが技術的に可能かどうかは尋ねていません。たとえば、ソートされたキーを追加すると、一部のツリー構造のバランスが崩れる可能性がありますか? (leveldb がツリーを使用していると言っているのではなく、類推を考えようとしているだけです ;-) )
つまり、「プライマリレコード」が次のように見えるとします(セパレータとしてのヌル)
- キー = uniqueTableID \0 uniqueRowID
- 値 = フィールドのコレクション
典型的な単一値フィールドのセカンダリ インデックスは次のようになります。
- キー = uniqueFieldID \0 keyValue \0 uniqueRowID
これにより、部分キー [uniqueFieldID \0 keyValue] による反復が可能になり、メイン レコードが削除された場合やキー値が変更された場合に、これらのキーを簡単に見つけて削除し、メイン レコードの uniqueRowID から作業を戻すことができます。したがって、同じ uniqueRowID で終わる複数のキー値が存在する可能性がありますが、uniqueFieldID で始まり、uniqueRowID で終わる特定の組み合わせのキーは 1 つだけです。
唯一のことは、ペアの値側に値を入れる必要がないということです。
私はこの概念設計に満足しており、誰かが穴を見つけることができるかどうかを確認しています. たとえば、leveldb 内部が歪んでパフォーマンスの問題が発生する場合。
1 つの特定のアプリには、そのようなキーが何万もあると予想されます。
保存したい値の例として、テキスト フィールドへのセカンダリ ワード インデックスは次のようになります。
- キー = uniqueFieldID \0 keyValue \0 GUID
- 値 = 単語の出現数、または大きなブロブのスキャンが高価な場合はオフセットのリスト