5つのテキストファイルに分散された非常に大量のデータ(2億6千万行の固定幅テキストで約250 GB)を外部ソースから毎日受け取ります。私はいくつかのビジネスロジックに基づいて、データの最初のグループ(ファイル1〜4)を2番目のグループ(ファイル5)と組み合わせる必要があるJavaアプリケーションを作成しています。
ただし、250 GBのテキストファイルから複数回のアクセス/読み取りを行うと、かなり時間がかかります。そこで、データを処理するためのより効率的な方法を見つけることにしました。データをデータベース(たとえばmysql Workbench)に保存し、テキストファイルの代わりにデータベースを使用して処理を行うと思います。このデータベースは、処理が完了すると削除されます。
一時データベースを使用するこのアプローチは、テキストファイルと比較してパフォーマンスを向上させることができますか?または、この大量処理を設計する方法のより良い提案はありますか?
注:私のアプリケーションは、32GBのRAM Intel Xeon Processor E5645および1 TB =ハードディスク
最初の4つのファイルがそれらの間でどのように関連付けられているか、ビジネスロジックがデータをどのように組み合わせるか、およびファイルの順序を想定できるかどうかを知らずに単純な答えを出すことは困難です。それでも、ここでは、検討するアプローチを自分で評価するのに役立つ一般的なアイデアをいくつか紹介します。
データは固定長です。つまり、ファイルアプローチとデータベースアプローチの解析、比較、変換が簡単です。
データベースは、処理を開始する前にすべてのデータをインポートする必要があります。これは、すべてのファイルのすべての入力フィールドを解析および変換することを意味します。これは、高速検索を必要とするフィールドのインデックスを構築することも意味します。これは最終的に、トランザクションの整合性管理のための追加のオーバーヘッドを意味する可能性があります。
このオーバーヘッドを最小限に抑えることができます。
インデックスの数が少ない場合は、テキストファイルを並べ替えるよりも、インデックスの作成にかかるコストは原則として小さいはずです(テキストファイルを並べ替えると、すべてのデータを何度も完全に書き換える必要があるためです)。
一時データベーステーブルは、ビジネスロジックに関連するフィールドのみを持つものとして定義できます。各入力テキスト行のメモは、大きな固定サイズのテキストフィールドに配置されます。これにより、インポート時の変換オーバーヘッド(日付、数値など)を最小限に抑え、原則として、ファイル内のテキストを自分で変換するのと同じレベルにすることができます。これにより、行をフェッチするときの内部データベース操作も削減されます(フィールドが多いほど、内部のメモリ内データセットを構築するのに時間がかかります)。
多くのデータベースには、インポート中に一時的なトランザクションの整合性を無効にできる一括アップロード機能があり、重いアップロードタスクの1つをさらに減らすことができます。
データベースエンジンには、データ処理を大幅に高速化できる機能があります。
データベースインデックスを使用すると、少数のレコードを見つけるためだけにファイルの大部分を繰り返し読み取ることが回避され、パフォーマンスが大幅に向上する可能性があります(テキストファイルが同じフィールドに従ってソートされている場合を除く)。
一般に、クエリオプティマイザーは自動的にクエリを最適化します(クエリを最適化しないと、慎重に手動で分析する必要があります)。
データベースキャッシュアルゴリズムは、アクセス(特に繰り返しアクセス)を最適化するために使用されます。
結論:テキストファイルがグループ化ロジックの基準に従って並べ替えられていない場合、およびデータを結合するシングルパスアルゴリズムが見つからない場合は、データベースアクセスが生のテキストファイルアプローチよりも優れたパフォーマンスを発揮する可能性が高いです。
重要な注意:データベースアプローチの最も重くて最もデリケートな部分はインポートです(特に古いマシンの場合)。幸い、非常に限られた労力でこのアプローチの実現可能性を評価できます。データベース構造を定義し、使い慣れたSQLエンジンを使用して、 mysqlimport
ユーティリティを使用してみてください。