0

私はデータベースを持っていますが、それはそれほど高速ではなく、約65000行の大きなCSVを持っています。これらの存在をクロスチェックし、必要に応じてデータベースを更新する必要があります。

  • CSVには、データベースIDを含む列があります。それは常に1:1の関係です。
  • CSVはデータベースへの新しい入力を保持する可能性があるため、データベースのDBエントリがない場合があります。
  • 速度が遅すぎるため、CSVをループして各行を確認できません。
  • 最初にデータベースからすべての結果を取得し、それらを毎回ループするように保存しても、大量のRAMが必要になるため、機能しません。

どうすれば次のことができますか?

  • CSVの行にデータベースエントリがあるかどうかを確認します。その場合は、別のCSVファイルに書き込みます。
  • 行にデータベースエントリがない場合は、別のファイルに書き込みます。
  • タイムスパンを5分以内、できればもっと短くしてください。

CSVには多数の列(たとえば70)がありますが、IDをクロスチェックするために必要なのは列5だけです。最初にCSVファイルをループしてからデータベースで確認しようとしましたが、速度が遅すぎます。10分以上かかる場合があります。また、データベースからすべてのエントリを取得し、それらをループしようとしました。ループを使用して、CSVを(を使用してBufferedStream)実行し、チェックします。これにより、時間が大幅に短縮されますが(最大5分)、データベースに存在しないエントリを記録することはできません。

速度を上げながらこれを行う方法はありますか?

4

2 に答える 2

1

適切な分析を行い、問題に対する鉄壁の解決策にたどり着くには、十分な情報がありません。いくつかの提案をすることができます。記録として、65,000 レコードの CSV はそれほど巨大ではありません。また、ストリームリーダーを使用してサイズがギガバイトのファイルを比較することに個人的に取り組んできたので、ファイルのウォークが遅すぎるということにも同意しません。

まず、問題を逆さまにすることを検討できます。CSV を実行するときにデータベースをプルするのではなく、セット全体をメモリにプルすることを検討してください (巨大なデータベースがある場合は良い考えではありませんが、管理しやすい場合はオプションです)。もう少し大きい場合は、データベースを別の CSV に書き出すこともできます (これは単一のテーブルまたはビュー (またはビューである可能性のあるクエリ) であると仮定します)。ここでの中心的な焦点は、遅いデータベースをループから解放することです。注: これが非常にトランザクションの多いシステムであり、「1 分 (または 5 分) までの正確なスナップショット」が必要な場合、これでは不十分な場合があります。非現実的な期待だと思います (多数の編集にもかかわらず、データは現在も 5 分前を表しています)。

次に、セットを減らすことを検討できます。質問で既に述べた簡単な方法は、作業中の CSV を 70 列から必要な 5 列に減らすことです。比較のためにデータベースから同じデータを取り出した場合も同様です。これは、読み込み時間がボトルネックである場合にのみ機能します。あなたの説明に基づいて、私はそれが事実であることを真剣に疑っています。

2 ビットのデータをメモリに入れて、そこで計算することも検討できます。とても早い。サイズが原因で 2 つの項目を比較してメモリに格納できない場合、これは機能しません。そのため、必要な列に絞り込むことが有用な演習となります。

データベースIDに言及しているため、CSVが複数のデータベースをチェックしているように聞こえます。最初にデータベース ID で CSV を並べることを検討してください。前述のように、非常に高速で、65,000 レコードを数秒でソートできるソート アルゴリズムがあります。一般に、ソートのボトルネックは、メモリーの量と I/O の速度 (主にディスク速度) です。その後、各データベースを攻撃できます。

最初に述べたように、実際の解決策ではなく、ヒントを提供するのに十分な情報しかありませんが、これがいくつかのアイデアに拍車をかけることを願っています.

于 2012-12-10T14:25:41.460 に答える
0

遅い回答ですが、この方法で修正しました。必要な CSV 列をDataTable. 次に、チェックする必要があるすべての行をフェッチし (フィルター処理できる特定の数があります)、それらのデータベース行を実行します。各行は、対応する ID をチェックしDataTable、データを新しい CSV に入れます。その後、DataTable の行は削除されます。最後に、存在してシステムにインポートされる行を含む CSV と、追加する必要がある行を含む CSV にエクスポートされる DataTable があります。

私が正しい軌道に乗るのを手伝ってくれたグレゴリーに感謝します。

于 2012-12-27T08:12:18.073 に答える