1

我有一个使用 xsd 方案将数据导出为 xml 文件的应用程序。

它会创建很多小文件。29Gb,其中文件的平均大小为 0.3MB 或 10KB。它创建了大约 140000 个文件。它用


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

将独立数据保存到文件

使用 MS Profiler,我将执行时间减少到 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)在第二行有 Dispose 是预期的行为吗?

4

1 回答 1

1

好吧,也许性能瓶颈是由 Parallel 造成的。请记住,对 HDD 的请求不是并行的,它们是排队的。

如果您的文件位于不同的位置、不同的网络共享或不同的物理硬盘驱动器上,您可以从 Parallel 获得性能提升。

另一件事,如果您使用的是 .NET 2.0,并且我看到您正在使用 using() 语法糖,您仍然应该调用 Dispose() 并取消引用 Stream,因为 using() 是错误的。

如果文件所在的分区是NTFS,那么请考虑小文件NTFS的性能缺陷。 NTFS 性能和大量文件和目录

于 2013-01-22T08:27:48.653 回答