2

大きなファイル(500 Mo)を読み取り、これらのファイル(protobufメッセージ-Google API)を逆シリアル化し、それをOracle 11 DBに挿入するJavaスタンドアロンアプリに取り組んでいます。

重要なことは、データベースには 1 つのメイン テーブルといくつかの小さなテーブル (辞書と比較できます) があるということです。すべての辞書について、Google キャッシュ (Guava) があります。メイン テーブルのキャッシュはありません。メイン テーブルには、挿入のみがあり、更新はなく、削除はありません。

現時点では、このアプリケーションは単一の JVM 上で実行されます。(潜在的に、マルチスレッドを追加できます。)

複数の JVM で動作するようにしたいと考えています。私の問題は、パフォーマンスを向上させ、適切に機能させるために何をすべきかを知ることです。私は 2 つの問題を特定しました。アプリをクラスタリングすると複数のファイルを同時に読み取ることができる場合、メイン テーブルへの挿入を高速化する方法と、キャッシュを更新する方法です。

誰かがそれについて考えを持っていますか?

4

1 に答える 1

2

メインテーブルへの挿入を高速化する方法

ジャックポット!ボトルネックを特定する必要があり、ファイルまたはデータベースの読み取りである可能性が最も高いです。ファイルは単純で、分割して別のマシンに置くだけです。もちろん、同じマシンで複数の JVM を実行しても、それらはすべて I/O で競合するため、役に立ちません。そのため、ファイルを分割して、JVM とともに複数のマシンに分散する必要があります。

protobuf のデシリアライズはボトルネックではないと思います。ある程度の CPU が必要ですが、それほど多くはありません。

最後に、データベースを作成します。単一のシングルスレッド JVM でデータベースを完全に利用できる可能性もありますが、試してみる価値はあります。最初にアプリをマルチスレッド化し、それが役立つかどうかを確認してください。

キャッシュを更新するには?

再びジャックポット。キャッシュも分散/クラスター化する必要があります。Guava キャッシュだけでは不十分です。RMI クラスター化された EhCache、Terracotta、Hazelcast などのより洗練されたものが必要になります。基本的にキャッシュ API を提供しますが、キャッシュが変更され、無効にする必要があることをクラスターの他のメンバーに通知します。

ところで、500 MiB はそれほど多くはありませんが、処理にどのくらいの時間がかかりますか? 繰り返しになりますが、速度を落としている原因を見つけるためにプロファイルを作成する必要があります。

于 2012-10-19T19:53:38.253 に答える