2009-03-31 13 views
0

テキストファイルのCSVレコードを処理するVB.netコンソールプログラムを作成しました。私はFileHelpers libraryCSVファイル処理をどのようにスピードアップしますか? (500万レコード以上)

とMSFTエンタープライズライブラリ4を使用しています。その時点でレコード1を読み込んでデータベースに挿入します。

テキストファイルで5百万件のレコードを処理するのに約3〜4時間かかりました。

処理を高速化する方法はありますか?以前にこのような大量のレコードを扱っている人はいますか?更新する新しいデータがあれば、そのレコードをどのように更新しますか?

編集:誰かがプロファイラを推奨できますか?オープンソースを好むか無料です。

+0

Microsoft SQL Server Management Studioを使用して、そのデータをSQL Serverデータベースに直接挿入してみませんか? –

+0

修正する必要がある場合は、Temproraryテーブルに挿入し、T-SQLで変更を適用することができます。 –

+0

どのようにして自動的に行いますか?人間の相互作用がなければ? – Jack

答えて

0

私は何かをスピードアップするのと同じように速度を上げます:それをプロファイラで実行し、何が最長になるかを考えます。

ここでボトルネックとは何かを推測する方法はありません。多分CSVファイルを解析するコードにバグがあり、その結果多項式ランタイムが発生しますか?たぶん、各行を処理するために使用される非常に複雑なロジックがありますか?知るか!

また、「記録」については、500万行はそれほど重いものではありません。私の頭の中には、頭がおかしいとは言えませんが、合理的なプログラムでは、はるかに少ない時間で良いプログラムです。

最後に、データベースにボトルネックがある場合は、トランザクションが挿入されるたびにトランザクションがコミットされているかどうかを確認してください。それはいくつかの重要な減速につながる可能性があります...

+0

@Davidは500万回の往復を過小評価しないで、環境に応じて多くのことができます。 – eglasius

2

時間がどこに行くのか調べてください。

本当のプロファイラのショート、以下を試してみてください。それだけで行ごとにファイルを読み込むのにかかる時間の長

  • 時間、彼らと何もせずに
  • サンプルラインに乗り、そしてどのように時間長いそれは5+万回
  • がランダムデータを生成し、データベースに挿入し、私の推測では、というデータである

ている時間、ちょうどそれを解析し、必要なものは何でも処理を行うのにかかりますベースはボトルネックになります。一度に1つのレコードだけを挿入する場合は、バッチ挿入よりもはるかに時間がかかる可能性があります。

2

私は過去にこのような多くのアプリケーションを行ってきましたが、最適化を見る方法はいくつかあります。

  1. は、あなたが適切にここにこの1つの小さなミスのようなもので、メモリを管理している書いているコードがクロールするプロセスを遅らせることができていることを確認してください。それがボトルネックになることとして

  2. データベースを書くことを考えてみては非同期であることを呼び出しますので、キューイングが

  3. OKかもしれないビットは、再度やって、インポート、インポートをやって、インデックスを削除を検討してください。

  4. インポートを行うにはSSISを使用することを検討してください。これは既に最適化されており、この種類のものはボックスから外しています。

+0

これはあまりにも長い時間を費やしてはいけません。ファイルを一度に1文字ずつ読み上げたり、指数関数のアルゴリズムなどを使用したりするなど、実際には明白でない限り、時間を無駄にしています。減速がどこにあるのか推測する。 –

+0

一度に1文字ずつファイルを読むのに何が問題になっていますか? – John

+0

@david良い点、もう1つは、私の#1のアイテムにとって、Ants Profilerのようなものが、良いトラブルシューティングツールになる可能性があるということです。 –

1

比較的小さなサンプルのプロファイラを試してみるといいでしょう。これは、実際のホールドアップがどこにあるかを特定するためのものです。

3

は一度記録1を読んで、バッチでそれらを読み、バッチでそれらを挿入するデータベースに

を挿入します。

+0

一括挿入/更新の方法に関するリンクがありますか? – Jack

+0

一括挿入はあなたの友人です。 http://msdn.microsoft.com/en-us/library/ms188365.aspx –

2

Microsoft SQL Server Management Studioまたはコマンドライン - SQLCMDを使用してSQL Serverデータベースに直接データを挿入するだけではどうですか。 CVCファイルの処理方法はわかります。

データベースでBulkInsertプロパティをTrueに設定する必要があります。

修正する必要がある場合は、テンポラリーテーブルに挿入して、変更内容をT-SQLで適用することができます。

0

メモリにロードし、DBに挿入します。 5百万行はあなたの記憶に納得してはいけません。問題は、本質的にあなたのディスクをスラッシングしていることです.CSVを読み込んでDBに書き込むことです。

0

あなたがそれらで何をやっているのかよく分かっていませんが、perlを考えましたか?私は最近、何千ものレコードを処理する同様のことをしていたVBスクリプトを書き直しました。そしてVBスクリプトでは約1時間からperlで約15秒になりました。

0

ファイルからすべてのレコードを読み取った後(1回のパスまたはブロック単位でファイル全体を読み取る)、SqlBulkCopyクラスを使用してレコードをDBにインポートします。 SqlBulkCopyは、私が知る限り、レコードのブロックをインポートする絶好の方法です。オンラインのチュートリアルがいくつかあります。

0

他にも提案されているように、まずアプリのプロファイルを作成します。

つまり、おそらくバッチインサートをすることで得られるでしょう。これは私が働いていた1つのアプリのケースであり、大きなインパクトでした。

それぞれが単純な挿入用である場合は、特に500万回の往復を考慮する必要があります。

0

同様の状況では、1行1回の挿入からSqlBulkCopy APIの使用に切り替えることで、かなりのパフォーマンス改善が見られました。

良い記事があります。

0

この機能を備えていると仮定して、データをデータベースに一括読み込みする必要があります。 Sql Serverでは、BCP、DTSまたはSSISを見ています.BCPは最も古いものですが、おそらく最も高速です。 OTOHそれはあなたのDBで実行できない場合は、すべてのインデックスをオフに実行する前に、私はそれが問題を引き起こしているのだと推測している.NETコードではない。

関連する問題