2012-02-16 7 views
2

私は、1つのスレッドと複数のスレッドを使用して100 MB +テキストファイルを読み込むためのスクリプトを作成しました。マルチスレッドスクリプトは、同じStreamReaderを共有し、StreamReader.ReadLine()呼び出し中にロックします。私の2つのスクリプトをタイミングした後、それらはほぼ同じ速度です(ReadLine()はほとんどの実行時間を占めるようです)。マルチスレッドを使用してファイルをすばやく読み取ることはできますか?

どこでこれを行うことができますか?私は、各スレッドが独自のStreamReaderで動作するように、ソースファイルを複数のテキストファイルに分割することを考えていますが、それはちょっと面倒です。私のプロセスをスピードアップする良い方法はありますか?

ありがとうございます!

答えて

4

1台のハードディスクでは、複数のコンシューマ(処理用)モデルを使用して1つのプロデューサ(ファイルを読み取る)を使用する以外にはあまりできません。ハードディスクは、次の読み取り位置を探すために機械的な「ヘッド」を動かす必要があります。これを行っている複数のスレッドは頭を跳ね返し、スピードアップを起こさない(悪い場合もありますが、場合によっては遅くなることもあります)。

入力ファイルを分割することはさらに悪くなりました。なぜなら、ファイルチャンクはもはや連続しておらず、それ以上追求する必要があるからです。

ので、大きなファイルのチャンクを読んで、いずれかの複数の消費者のスレッドの同期キュー(例えばConcurrentQueue)でタスクを置くか、または内蔵のスレッドプールにアクセスするためにQueueUserWorkItemを使用して単一のスレッドを使用します。

+0

ああ、意味があります。ありがとう! – sooprise

0

ここでは、次のことができますか?
複数のHDDを追加し、1つのHDDに1つのスレッドを追加します。ファイルをHDDに分割します。 RAIDのようなもの。

編集: 同様の質問がここで何度も尋ねられました。 1つのスレッドを使用してファイルを読み取り、1つのスレッドを処理するだけです。マルチスレッドは不要です。

+0

HDD?あなたはハードドライブを意味しますか? :S – sooprise

+0

yea、ハードディスクドライブ – Adrian

+0

あなたの編集に応じて、スクリプトからさらに性能を引き出そうとしています。大きなファイルを読むのにまだ時間がかかりますが、スピードを上げることができればそれは私の目標です。 – sooprise

関連する問題