【问题标题】:Is my binary files caching method stupid?我的二进制文件缓存方法愚蠢吗?
【发布时间】: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 或更多。 “巨大”是什么意思?

标签: c# file binary


【解决方案1】:

只需阅读一次并丢弃结果。这会将它们放入操作系统缓存中,并使未来的读取速度非常快。使用操作系统缓存是自动的并且非常安全。

或者,让自己成为Dictionary<string, byte[]>,您可以在其中存储由文件路径键入的文件内容。请注意不要耗尽可用内存,否则您的应用会因分页而失败或变得非常缓慢。

【讨论】:

  • 您能否详细说明第一部分。如何做那个操作系统缓存?任何与此相关的链接可能会有所帮助?
  • 操作系统缓存您读取的数据。下一次读取将只是从操作系统缓存到应用程序缓冲区的 memcpy。这对所有操作系统都很常见。
  • @usr 我做了这个新的 MemoryStream(File.ReadAllBytes(_PATH_TO_FILE));它运行良好,就像我第二次运行该应用程序时一样,速度非常快。
  • 如果它工作正常,那么问题是什么?我的建议是尽可能只使用操作系统缓存,否则缓存为字节 []。不需要 MemoryStream。
  • 问题是“我做对了吗?”。我只是不希望它正常工作,我也想确保我没有愚蠢地做它。 “是”或“否”可以回答这个问题,但我也想解释一下预缓存后究竟发生了什么,因为读取非预缓存二进制文件和预缓存文件之间的周期差异约为 544.000 个周期,这是巨大的对我来说。
猜你喜欢
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多