写文本文件-性能方面

本文关键字:性能 方面 文件 文本 | 更新日期: 2023-09-27 18:02:57

我们即将开始一个新项目,该项目涉及到在流程结束时写入大约5,000个不同大小的文件。所有的文件都是普通的文本文件,我想知道什么是最好的方法(如果有人有经验)来写它们。

我正在考虑使用文件模板(预加载到内存)或直接文件流。

我想知道是否有人有经验,可以与我分享。由于

写文本文件-性能方面

我建议你写一个原型,提前检查你是否能以你希望实现项目的方式满足性能要求。但不要忘记,硬盘有时很难评估(尽管它们的名字可能不是来自这个事实:-)):它们有缓存,它们的性能可能在后台进程、碎片、文件系统等方面差异很大。

经验法则是减少文件写的次数。通常,如果您先将所有内容写入内存缓冲区,然后将该缓冲区写入磁盘,则速度最快。(一个非常糟糕的方法是一个字符一个字符地写。)

根据文件系统的不同,写一个大文件可能比写很多小文件更快,所以创建一个ZIP存档可能是一种选择。

在windows上有MultiMediaFile IO API(本机),在某些情况下可以比标准I/O机制(http://home.roadrunner.com/~jgglatt/tech/mmio.htm)更快,即使您的内容不是"多媒体"

奇怪的是,"最好的方式"只有你知道。

例如,用小块写大文件可能是一种负担得起的解决方案,因为您不会消耗太多内存,并且以"慢写"的方式执行操作。Bad:长IO操作,Good:低内存

或者在大块数据中收集数据并执行单个原子写。:你需要更大的内存。Good:通常建议选择在尽可能短的时间内打开/读写/关闭,

或者使用MemoryMappedFiles:所以使用常量(通常)指针指向某个文件,并在可承受的性能低内存消耗之间进行平衡。通常情况下非常好,如果不可能的话,选择用于非常大的文件,比如多媒体文件的处理。

选择取决于你。

喜欢深入的性能分析的东西,我建议像Rico Mariani博客这样的惊人来源

如果你使用标准的。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
}

性能应合理。当写入文件时,只需将字符串保持在适当的大小(如果有必要,可以读写和块)以避免内存问题。例如,如果组成文件的数据为10gig,则必须将字符串写入块中。

我曾经不得不从数据库中读取1000个blob,并将它们推送到文件系统上的分发服务器。我最初的方法是一个单一的读和写。这很好,然后我使用多线程方法并获得了不错的性能增益。

我将首先执行单个操作方法,然后进行一些性能运行。如果这只需要花费一定的时间,并且每个人都很开心,那就完成了。如果您需要使其为Y,则实现多线程方法。

请注意,我将使线程的数量可配置,以便可以调用性能。太多的线程会使它变慢。需要找到最佳位置,所以使其可配置。这通常取决于硬件。

对于如此多的写入磁盘,我将更多地关注磁盘布局(raid等),因为节省几个CPU周期可能不如拥有一个更快的磁盘子系统更有帮助。