1

ユーザーが郵便番号を含むファイルをアップロードできるようにする必要があるアプリケーションが Web 上にあります。これらのファイルは .csv ファイルです。どのユーザーも自分のコンピューターからファイルをアップロードできますが、問題は、ファイルに何千ものレコードが含まれている可能性があることです。現在、ファイルを取得して、正しいヘッダーがあることを確認していますが、レコードを 1 つずつデータベースにプッシュしています。

私は c# asp.net を使用していますが、これを行うためのより良い方法はありますか?, コードからより効率的ですか?. 外部のインポーター、データ インポーター、SQL Server ビジネス インテリジェンスなどのツールは使用できません。どうすればこれを行うことができますか?, 私はそれをメモリに入れてからデータベースにプッシュすることについて何かを読んでいました?. URL、例、または提案をいただければ幸いです。

よろしく

4

3 に答える 3

1

まず、あなたが実際に求めているのは、 「大きなファイルをどのように処理し、処理されたデータをデータベースに挿入するのですか?」ということだと確信しています。.

私が正しいとすれば、この質問は「紐の長さはどれくらいですか?」に似ていると言えます。実際には、大きなファイルをデータベースに処理するための実装は、要件によって大きく異なります。

ただし、スペクトルの最も単純な端では、ファイルをテーブル (またはフォルダー) に直接アップロードし、x 分ごとに実行され、テーブルを走査し、各ファイルを選択し、一括挿入を使用してデータを処理するWindows サービスを作成できます。 prepare メソッド(これにより、パフォーマンス上の利点が得られる場合があります)。

または、 MSMQ (Microsoft Message Queueing)のようなものを見て、アップロードされたファイルをキューに直接保存することもできます。このキューは、アプリケーションから完全に独立しており、いつでも処理でき、簡単にスケールアウトできます。

結局のところ、正直なところ、ここにいる誰もあなたの質問に「正しい」答えを与えることができるとは思いません。なぜなら、実際には答えがなく、実験によって実装の改善を見つけることしかできないからです。

于 2012-10-05T00:47:39.193 に答える
1

これらのレコードは同じテーブルにあり、互いに関連していないため、ここではParallel.ForEachが有効な答えになる可能性があります。個々のレコードをデータベースに挿入する静的メソッド (必ずしも静的である必要はない) があると仮定すると、配列の各インデックスが CSV の行を表す配列に対してParallel.ForEachループを実行できます。

これは、大きなファイルをサーバーにアップロードすることが最初の問題ではないことを前提としています。それも問題の一部である場合は、ファイルを圧縮し、アップロード後にSharpZipLibなどを使用して解凍することをお勧めします。テキストは非常によく圧縮されるため、ユーザーの観点からは、これがパフォーマンスにとって最大の恩恵となる可能性があります。

于 2012-10-05T00:57:36.383 に答える
1

これに最大 100 万件のレコードが含まれる場合、データベースへのレコードの挿入を管理するサービスを作成して、タイムアウトを回避し、Web iis のストレスを防ぐことが最善の方法です。

Windows サービスにすると、アップロードされた特定のディレクトリで zip ファイルを処理するようにサービスに通知できます。

また、より高速なデータベース トランザクションのために一括挿入を使用することをお勧めします。

検証がある場合は、おそらくデータを別のデータベースにステージングし、データを検証してから最終データベースにプッシュできます。

于 2012-10-05T00:28:04.317 に答える