1

まず、シナリオについて簡単に説明します。データベースはSybaseです。いくつかの2〜3kのストアドプロシージャがあります。ストアドプロシージャは、膨大なデータ(約100万レコード)を返す可能性があります。必要なプロシージャを呼び出し、データをxml形式でクライアントにフラッシュするサービス(サーブレット/スプリングコントローラ)があります。

(複数の列と複数の条件で)フィルタリング(複数の列と複数の条件)/並べ替え(いくつかの動的基準に基づく)を行う必要があります。これを実行しました。

問題は、データが膨大であるため、メモリ内ですべてのフィルタリング/並べ替えを行うのは適切ではないということです。私は以下のオプションを考えました。

オプション1: ResultSetオブジェクトを取得したら、X番号を読み取ります。レコードの数をフィルタリングし、ファイルに保存し、すべてのデータが読み取られるまでこのプロセスを繰り返します。次に、ファイルを読み取り、データをクライアントにフラッシュします。

フィルタリング/並べ替えを高速化するために、ファイル内のデータを並べ替える方法と、オブジェクトをファイルに保存する方法を理解する必要があります。

オプション2: データを取得してフィルタリングし、指定された基準に基づいて並べ替えてストリームとして返すJavaAPIを探します

オプション3: hsqldb、h2databaseなどのインメモリデータベースを使用しますが、これは役立つのではなくオーバーヘッドになると思います。最初にデータを挿入してからデータをクエリする必要があります。これにより、ファイルシステムも使用されます。

注ストアドプロシージャを変更したくないので、データベースでフィルタリング/並べ替えを行うオプションはオプションではないか、他に何も機能しない場合は最後のオプションになる可能性があります。

また、役立つ場合は、ResultSetから読み取ったすべてのレコードをマップに保存します。キーは列名であり、このマップはリストに保存され、そこにフィルタリングと並べ替えが適用されます。

メモリフットプリント、スケーラブル、パフォーマンスの観点から、またはこのシナリオに適したその他のオプションに適していると思うオプションはどれですか。

ありがとう

4

2 に答える 2

2

オプション3をお勧めしますが、インメモリデータベースである必要はありません。代わりに適切なデータベースを使用できます。他のオプションは、大量のデータを並べ替えるという一般的な問題に対するより具体的な解決策になります。つまり、結局のところ、データベースの目的は正確であり、非常にうまく機能します。

オプション3が適切なソリューションではないと本当に確信している場合は、ソート/マージソリューションを実装できます。すでに行っているようにsを収集しますMapが、レコードの制限(たとえば、10,000)に達したときはいつでも、それらを並べ替え、ディスクに書き込み、メモリからクリアします。

データが完成したら、書き込んだすべてのファイルを開いて、それらのファイルをマージできます。

于 2012-12-20T12:30:19.230 に答える
1

hadoopはあなたの問題に適用できますか?

データベース自体のデータをフィルタリングする必要があります。他のすべてのプロシージャを実行したり、データを結合したり、フィルタリングしたりする集約プロシージャを作成できます。ただし、最適なオプションは、必要なデータのみを返すように2〜3千のストアドプロシージャを変更することです。

于 2012-12-20T11:45:11.560 に答える