web-dev-qa-db-ja.com

複数のファイルの読み取りを最適化する

私は誰かが助けてくれることを望んでいる独特の問題を抱えています。

大きなテキストファイルが1つあります。Productionファイルです。ファイル内のデータは次の形式で区切られます

Reference|Cost Centre|Analytics Base Value|.... 
UMBY_2288|023437|2883484|... 
NOT_REAL|1343534|283434|...

このファイルの平均サイズは約30MBです。約120000行。

そして、私は約20の地域ファイルを持っています。これらのファイルは、構造が現在の大きなファイルに似ています。それらが小さいことを除いて。平均サイズ50000行。

次に、大きなProdファイルの各行をループする必要があります。 Referenceコードごとに、「Regional」ファイルのそれぞれを検索して、特定の参照コードが含まれているファイルを確認する必要があります。次に、その行からレポートにデータの一部をコピーします。調べるファイルを事前に決定する方法はありません。また、各参照は複数のRegionalファイルに含めることができます。

ご想像のとおり、各ファイルの各行をループすることは、非常に時間のかかるプロセスです。メモリの制約により、ファイルをメモリにロードできません。

誰かが私がこれを行う方法について何か賢いアイデアを持っていますか?コードサンプルは必要ありません。この問題を解決する方法についてのポインタです。

私はC#でツールを開発しています。

2
greenkode

解決策は、各ファイルを1回読み取り、日付をメモリに保存することです。キーが参照番号である連想配列または同様のデータ構造を保持します。次に、マスターファイルを処理するときに、各参照の検索に数マイクロ秒しかかかりません。

データが大きすぎてメモリに収まらない場合は、一時的なsqliteデータベースを作成できます。

4
Bryan Oakley

これらの負荷はメモリに対して非常に小さいように見えるため、アプリケーションにバグがある可能性があります。おそらく数ギガバイトのシステムで多くを使用しているようには思えません。

しかし..あなたの問題に対する解決策があります。それは「リレーショナルデータベース」と呼ばれ、この種の負荷はそれらの多くにとって非常に小さなフライです。あなたが見ている種類の負荷については SQL Express がおそらく望んでいるように聞こえます。

すべての地域ファイルをテーブルにロードし、インデックスを作成して、現在よりもはるかに効率的に参照を処理できます。

3
James Snell