0

テキスト ファイルから JSON オブジェクトを解析し、それらを MongoDB に永続化する必要があるという要件があります。

いくつかの詳細 -

  1. ファイル サイズ ~ 1-10 MB、#json オブジェクト ~ 100 k、単一の json オブジェクトのサイズは非常に小さい..
  2. Mongodb クラスター (シャーディングおよびレプリケート)
  3. パフォーマンス - 時間は貴重です..
  4. ファイル全体を解析して検証しない限り、mongodb コレクションにオブジェクトをダンプすることはできません。
  5. 私のアプリは J2EE スタック (Spring 3.2) を使用しています

だから今、mongodbに一括挿入する前に保存する必要がある100万個のJavaオブジェクトがあります..(mongodbはシャードされています..パフォーマンスを向上させるために事前に分割する必要があります)

私の質問は、これを効率的にするにはどうすればよいですか? 私が考えたいくつかの方法 -

  1. オブジェクトをシリアライズしてファイルに保存します。(問題: IO 時間)
  2. スタンドアロンの非シャード mongo で一時コレクションを作成してから、必要なコレクションに一括挿入します (#1 よりも見栄えがします)。

誰かが同様の問題について彼女の経験を共有できますか..? 他の情報が必要な場合はお知らせください..

4

3 に答える 3

3

提案されたインメモリ ソリューションは、長期的には適切なソリューションではありません。メモリに収まらないデータを顧客に提供すると、アプリの再設計が必要になる可能性があります。

RDBSM では、トランザクションの目的を活用する必要があります。ストリーム アプローチを使用するだけです。つまり、データをロードし、検証し、DB に入れます。無効化されたオブジェクトに遭遇した場合は、トランザクションをロールバックするだけで問題ありません。RDBMSは通常テーブル全体をロックし、誰もそれらを読み取ることができないため、データを潜在的に長時間ロックできるかどうかによって異なります。

現時点では、NoSQL DB の一貫性が低い場合に問題を解決できます。ポイントは、データのプログラミング ロールバックを提供する必要があるということです。

  1. Redis などの他の DB を使用して、一時データを保存できます。Redis にはオプションの永続性があるため、大容量のメイン メモリを利用して、メモリ サイズが収まらない場合にのみデータをハード ドライブに保存できます。
  2. または 一括挿入を提供し、準備ができていないデータを (ブール値フラグなどで) マークすることができます。明らかに、本番データに対するクエリは、準備ができていないフラグを使用してすべてを回避する必要があります
  3. 一時テーブルを使用すると、2 つの同じ同時操作が影響を与えるため、多くの制約があります。

どのように設計しますか?

おそらく、この準備ができていないデータに対してmongo の 1 つのインスタンスを使用して、相互の影響を回避し、本番環境に移行できることがわかったら、それらを正しいテーブルに移動します。

于 2013-10-23T07:22:39.147 に答える
1

あなたが言及した両方の方法は問題ありません。このように考えることもお勧めします。

  1. ファイルサイズはそれほど大きくないので、オブジェクトを保持する配列を持つことができます。
  2. オブジェクトを検証したら、それを配列にプッシュします。
  3. すべてのオブジェクトが検証されたら、それらを mongoDB に挿入できます。
于 2013-10-23T06:51:39.387 に答える
0

RAM と直接ByteBufferのマップを使用します。この場合、ヒープ RAM に限定されません。ByteBufferそして、InputStreamto processでラップすることができます- InputStream で ByteBuffer をラップします。この方法はトリッキーで、実験が必要な場合があります。つまり、ByteBuffer.

于 2013-10-23T08:12:54.943 に答える