2012-02-24 6 views
2

私は3,000万のレコードを提供するかなり複雑なデータベースクエリを持っています。メモリに収まるデータ量の約15倍です。データベースからすべてのレコードに順番にアクセスする(ソートする)必要があります。パフォーマンス上の理由から、注文書の準備には約40分を使用するResultSetが使用されているため、「注文」明細書を使用することはできません。ソートされたファイルMergesortまたはデータベース?

  • 平らにしたデータで到着する順不同のファイルに結果のデータをダンプ

    1. とマージソートのいくつかのフォームを使用します。

      は、私は私の問題を解決するために、2つの可能なオプションを参照してくださいそれを二次データベースにダンプし、データベースの順序付けメカニズムを使用して再選択します。

    あなたは優雅さとパフォーマンスの理由からどちらを好きですか?

    あなたの選択は、数2である場合は、データベースが使用する提案がありますか? SQLite、MySQL、またはApache Derbyを好むでしょうか?

  • 答えて

    1

    大量のデータをソートするために、1つの解決策は、あなたがロードできるデータのブロックにそれらを並べ替えることです。例えば30番目(15 * 2)とし、それらのレコードをソートする。これにより、ソートされた30のファイルが表示されます。

    30個のソートされたファイルを取り出し、それらの間のマージソートを行います。 (これには少なくとも30レコードが必要です)ソート時に処理できます。

    ところで:ITSは、より強力なコンピュータを購入するその時間も可能です。 16GBのメモリとSSDを1000ドル近く購入することができます。 $ 2000の場合、32 GBのメモリを持つ高速のPCを手に入れることができます。これはあなたに多くの時間を節約することができます。 ;)

    +0

    私はmerge-sortがどのように動作するのか(そして関連するソートアルゴリズムでもメモリを利用しようとしています)、私は高速/よりエレガントなマージソートやデータベースの質問に対する答えを探していますソート。私はどちらの実装を選択しても、私の仕事時間はより良いPCよりも高価になるだろうが、私の会社はまだ32bit Windows上にあり、32bit-JVMで利用可能な1.5GBのメモリを既に最大限に活用している。 – Jonathan

    +0

    最も洗練された解決策は、ジョブに適切なツールを使用することです。 ;)あなたの制限を考えると、私はあなたが働くものと一緒に行かなければならないと言います。 AFAIK一般的に受け入れられている解決策は、この状況では、マージソートです。個人的に私はあなたの標準システムを電子メールと単語に使用し続けますが、このタイプの問題には使用しません。 –

    +0

    解決策2が何らかの理由で考慮され、却下されたり受け入れられたりした場合は知っていますか?解決策を拒否する理由はありますか、それがより独創的な解決策であるに過ぎないのでしょうか?私の観点から見ると、mergesortにはさらに1回の読み取り/書き込みサイクルが必要ですが、ファイルを連続して書き込むことは、同じ量のデータをデータベースに挿入するよりもはるかに高速ですが、問題はそれほど速いのですか?残念ながら、私は解決策を比較することはできません - 私は両方を実装するのではなく、両方を実装する予算があります。 – Jonathan

    0

    どの方法があなたに適しているかは言うまでもありません。あなたは本当にそれをベンチマークする必要があります。
    あなたの記憶を増やし、そこに順序付けられたインデックスを保持することをお勧めします。

    1

    最高のパフォーマンスを得るには、間違いなくオプション1を使用します。データをフラットファイルにダンプし、適切な外部ソートプログラムでソートしてから、必要な項目のインデックスに基づいてディスク/データベースからデータを取り出します。再度読み込むと、すべてのオプションから最小限のリソースが使用されます。レコードの長さとシステム構成(メモリ、ディスク速度)に関する詳細を投稿したい場合は、どれくらい時間がかかるかを教えてください。

    オプション2の問題は、それは単にあなたが現在別の形で持っている問題を再現するということです。私はあなたの質問からどのくらい複雑なクエリであるか(あなたが参加しているテーブルの数)を知ることはできません。また、参加に40分を費やしているかもしれません。しかし、そうであっても、データが利用可能なメモリの15倍の大きさであれば、オプション2は外部ソートを行わなければなりません。これをうまくやっている唯一のデータベースは、商業的な外部のソートをカバーするように設計されているデータベースなので、オプション1に戻ってきます。

    優雅さに関しては、それはしばしば見る人の目の前にあります;-)。個人的には、それ自体が超高性能でエレガントであることがわかりますが、それはちょっと主観的です。

    関連する問題