1

xsd スキームを使用してデータを xml ファイルとしてエクスポートするアプリがあります。

小さなファイルがたくさん作成されます。ファイルの平均サイズが 0.3MB または 10KB の 29Gb。約140000個のファイルを作成します。それは使用しています


 Enumerable.Range(1, gs.Count)
             .AsParallel()
             .ForAll

独立したデータをファイルに保存する

MS プロファイラーを使用すると、実行時間が 30 分に短縮されました。ピーク時に最大 20Mb/s の書き込みが可能です。

したがって、トップ プロファイラーの結果の最終バージョンは次のようになります。

System.IO.File.Open(string,valuetype System.IO.FileMode) 30,14 % System.IDisposable.Dispose() 22,09% System.Xml.Serialization.XmlSerializer.Serialize(class System.IO.Stream,object) 13,42 %

コードは次のとおりです。

using (Stream streamw = File.Open(fileName, FileMode.Create))
{                  
        formatter.Serialize(streamw, this);                    
}

フォーマッタは次のとおりです。

static XmlSerializer formatter = new XmlSerializer(typeof(XItemDesc));

質問は次のとおりです。

1) プロファイラーの結果は、HDD のパフォーマンスが最大に達したことを意味しますか?

2) 2 行目に Dispose を配置するのは意図した動作ですか?

4

1 に答える 1

1

まあ、おそらくパフォーマンスのボトルネックは Parallel によって作成されます。HDD への要求は並列ではなく、キューに入れられることに注意してください。

ファイルが異なる場所、異なるネットワーク共有、または異なる物理ハード ドライブにある場合、Parallel によってパフォーマンスが向上します。

もう 1 つ、.NET 2.0 を使用していて、using() シンタックス シュガーを使用していることがわかった場合でも、Dispose() を呼び出してストリームを逆参照する必要があります。using() にはバグがあるからです。

ファイルが置かれているパーティションが NTFS である場合は、小さいファイルでの NTFS のパフォーマンスの欠点を考慮してください。 NTFS のパフォーマンスと大量のファイルとディレクトリ

于 2013-01-22T08:27:48.653 に答える