3

LANネットワーク共有上にそれぞれ0〜8kbの数十万の小さなテキストファイルがあります。とでいくつかの相互運用呼び出しを使用してkernel32.dllFindFileEx各ファイルの完全修飾UNCパスのリストを再帰的にプルし、パスをメモリのなどのコレクションクラスに格納できますList<string>。このアプローチを使用すると、List<string>かなり迅速にデータを取り込むことができました(3分間のファイル名と比較して50kのファイル名あたり約30秒Directory.GetFiles)。

ただし、ディレクトリをクロールしてファイルパスをにList<string>保存したら、リストに保存されているすべてのパスをパスして、小さなテキストファイルの内容を読み取り、読み取った値に基づいてアクションを実行したいと思います。

テストベッドとして、List<string>このLANネットワーク共有への42,945個のファイルパスを格納している各ファイルパスを繰り返し、それぞれに対して次の行を実行しましたFileFullPath

            StreamReader file = new StreamReader(FileFullPath);
            file.ReadToEnd();
            file.Close();

したがって、これらの行だけで、リストに保存されている42,945個のファイルパスすべてに対して13〜15分の実行時間がかかります。

C#を介して多くの小さなテキストファイルをロードするためのより最適な方法はありますか?考慮すべき相互運用機能はありますか?それとも、これは私が期待できる最高のものですか?とても長い時間のようです。

4

1 に答える 1

3

Directory.EnumerateFilesを使用して、ファイルを読みながら処理することを検討します。

これにより、42,945ファイルのリストを一度に実際に保存する必要がなくなり、PLINQを使用して一部の処理を並行して実行できる可能性が広がります(ファイルの処理要件によって異なります)。

処理に合計時間のかなり大きなCPU部分がある場合(そしてそれが純粋にI / Oバウンドではない場合)、これは必要な完全時間の点で大きな利点を提供する可能性があります。

于 2012-08-21T18:23:03.267 に答える