時期尚早の最適化がすべての悪の根源であると彼らが言うことを私は知っています...しかしそれはその頃です。
次の操作を実行する、遅いが動作する手順があります。
- file.inputからチャンク(シーケンシャル)を読み取ります
- チャンクを変換する
- 変換されたチャンクをfile.outputに書き込む(追加する)
file.inputとfile.outputは、最終的に同じサイズの球場(10-100 + GB)になります。チャンクは通常約10Kです。変換ステップは、独自のフォーマット間の変換にすぎません。説明のために、リアルタイム圧縮アルゴリズムと同等の計算値であると見なすことができます。
これらの手順は現在、シングルスレッドで実行されています。
私の質問:これをより良いパフォーマンスにするにはどうすればよいですか?
処理されるデータの純粋な量に基づいてこれが「高速」になることは決してないことを私は理解していますが、これを高速化するための比較的単純で標準的な手法がいくつかあると信じなければなりません。
読み取りステップ(1)にバッファリングを追加してみました。つまり、チャンクサイズよりもはるかに大きなブロックを読み取り、バッファーから読み取ります。これは役に立ちました。ただし、変換ステップ(2)と追加(3)で実行できることがあるかどうかについては、少し行き詰まっています。
Resource Monitorによると、CPU使用率は30〜45%の間で変動し、ディスクI/Oの使用率は一定期間持続します。
ネイティブライブラリへの一連のP/invoke相互運用機能を備えたC#を使用しています。