我们即将开始一个新的项目,在流程结束时,它会编写大约5,000个不同大小的文件。所有文件都是常规文本文件,我想知道编写它们的最佳方法是什么(如果有人有经验)。
我正在考虑使用文件模板(预加载到内存)或直接文件流。
我想知道是否有人有经验并可以与我分享。 感谢
答案 0 :(得分:2)
如果您能够以您希望实现项目的方式满足性能要求,我建议您编写原型进行检查。但是不要忘记硬盘有时很难评估(虽然它们的名字可能不是来自这个事实:-)):它们有缓存,它们的性能可能在后台进程,碎片,文件系统等方面有很大差异。
经验法则是减少文件写入次数。通常,如果您先将所有内容写入内存缓冲区,然后将此缓冲区写入磁盘,则速度最快。 (一种非常糟糕的方法是用char写char。)
根据文件系统的不同,编写一个大文件而不是许多小文件也可能更快,因此创建ZIP存档可能是另一种选择。
在Windows上有MultiMediaFile IO API(本机),在某些情况下可以比标准I / O机制(http://home.roadrunner.com/~jgglatt/tech/mmio.htm)更快,甚至如果您的内容不是“多媒体”。
答案 1 :(得分:0)
古玩的事情是“最好的方式”只知道你。
例如,使用小块编写大文件可能是一种经济实惠的解决方案,因为您不会消耗太多内存并以“慢速写入”方式执行操作。 错误:长IO操作,良好:内存不足
或者收集大块数据中的数据并执行单个原子写入。 错误:您需要更大的内存。 良好:通常建议选择在最短的时间内打开/读写/关闭,
或使用MemoryMappedFiles:因此,使用常量(通常)指针指向某个文件,并在经济实惠的性能和低内存消耗之间进行平衡。通常非常好,如果不是唯一可能的话,选择非常大的文件,如多媒体文件处理。
选择取决于你。
关于深度性能分析的内容,我会建议像Rico Mariani blog
这样令人惊讶的来源答案 2 :(得分:0)
如果你使用标准的.Net库并做这样的事情(在try catch块中):
using (StreamWriter writer = new StreamWriter("filenumber1.txt"))
{
writer.Write("This is a test"); //Write no newline
writer.WriteLine("This is a test"); //Write with newline
}
表现应该合理。写入文件时,只需将字符串保持适当的大小(如果必须,读取和写入以及块)以避免内存问题。例如,如果组成文件的数据是10 gig,则需要以块的形式写入字符串。
我曾经不得不在数据库中读取1000个blob并将它们推送到文件系统上的分发服务器。我最初的方法是单次读写。那没关系,然后我使用了多线程方法并获得了不错的性能提升。
我会首先执行单个操作方法并执行一些性能运行。如果花费X时间并且每个人都快乐,那就完成了。如果需要将其设为Y,请实现多线程方法。
请注意,我会让线程数量可配置,以便可以提高性能。线程过多而且速度变慢。需要找到最佳位置,以便使其可配置。这通常取决于硬件。
答案 3 :(得分:0)
由于大量写入磁盘,我会更多地关注磁盘布局(raid等),因为保存几个CPU周期可能没有像拥有更快的磁盘子系统那样有用。