私はかなり一般的な問題だと考えているが、自分自身で、またはこのフォーラムを閲覧することで良い解決策を見つけることができなかった。私はなどCで効率的にファイルを書き込む大ファイルリストを作成する
ファイル名、ファイルパス、ファイルサイズ、ハッシュ、最大の問題など、いくつかの追加情報を含むフォルダのファイルリストを取得するためのツールを書かれている
問題私が持っているのは、フォルダの中に何百万ものファイルが入っているということです。
可能な解決策
私は2つのソリューションを持っているが、それらのどちらも理想的です。
ファイルが読み取られるたびに、情報はファイルにまっすぐ書き込まれます。これは問題ありませんが、ファイルをロックしているスレッドの問題に遭遇せずにファイルをマルチスレッドすることはできません。
ファイルが読み取られるたびに、その情報は、ConcurrentBagなどの何らかの形式のコレクションに追加されます。私は、ファイルの列挙をマルチスレッド化し、それらをコレクションに追加することができます。列挙が完了したら、File.WriteAllLinesを使用してコレクション全体をファイルに書き込むことができます。コレクションに5千万エントリを追加すると、ほとんどのマシンのメモリが不足します。
その他のオプション
コレクションに項目を追加し、それはそのようなコレクションか何かで、レコードの一定数に到達したときにファイルに書き込む方法はありますか?
私はBlockingCollectionを調べましたが、プロデューサがマルチスレッド化されるため、実際にはすぐにいっぱいになりますが、コンシューマはシングルスレッドのみになります。
あなたのオプション2に行くことができますが、いくつかの事前定義されたしきい値より大きいエントリー、すなわちファイルに書き込んで、あなたの並行バッグを定期的に清掃してください。 – serhiyb
サイドノート:ディスク(および他のすべてのI/O操作)は、一般的にはCPUバインディングではなくI/Oバインドです。マルチスレッドのような操作を単一のソースに対して実行しても、パフォーマンスが向上する必要はありません。人々が主な理由は、そのようなコードを書くことは、シングルスレッド操作よりも面白いことです - あなたがそれをやっている理由があなたの目標に沿っていることを知っていることを確認します。 –
@AlexeiLevenkov、ありがとう。このアプリケーションはストレージサーバーで使用するため、IOは単一のマシンのディスク上で実行するのと同じ問題であってはなりません。 – Ninja