【发布时间】:2013-12-16 17:15:14
【问题描述】:
在我的 C# 应用程序中,我必须读取大量二进制文件,但在第一次运行时,使用 FileStream 和 BinaryReader 读取这些文件需要很多时间。但是第二次运行应用程序时,读取文件的速度提高了 4 倍。
阅读这篇文章“Slow reading hundreds of files”后,我决定预先缓存二进制文件。
在阅读了另一篇文章“How can I check if a program is running for the first time?”之后,我的应用现在可以检测它是否是第一次运行,然后我使用这种简单的技术“Caching a binary file in C#”预缓存文件。
还有其他方法可以预缓存大量二进制文件吗?
编辑:
这就是我读取和解析文件的方式
f_strm = new FileStream(@location, FileMode.Open, FileAccess.Read);
readBinary = new BinaryReader(f_strm);
Parse(readBinary);
Parse() 函数只包含一个我用来解析数据的 switch 语句。 我不会做更复杂的事情。例如,我尝试读取和解析 10.000 个 601KB 的二进制文件,读取和解析文件花费了 39 秒和大约 589.000 个周期。
当我再次运行该应用程序时,最终读取和解析大约需要 45.000 个周期和 1.5 秒。
编辑: “大量”文件是指数百万个文件。情况并非总是如此,但大多数时候我必须处理至少 10.000 个文件。这些文件的大小可以在 600Ko 到 700MB 之间。
【问题讨论】:
-
我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
-
好的,感谢您的编辑。很抱歉这个错误。
-
我建议仅在需要时进行缓存,因为缓存大量您可能不使用的信息不会有效 IMO
-
这非常模糊,因此很难判断是什么在第一次减慢了读取速度,可能很多(磁盘休眠、缓存)。您能否发布一个示例或配置文件结果来说明为什么它很慢?
-
为“巨大”一词加上一个数字非常重要。对于一些人来说,这意味着很多 MB,对于一些人来说是很多 GB,对于其他人来说是很多 TB 或更多。 “巨大”是什么意思?