Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的二进制文件缓存方法愚蠢吗?_C#_File_Binary - Fatal编程技术网

C# 我的二进制文件缓存方法愚蠢吗?

C# 我的二进制文件缓存方法愚蠢吗?,c#,file,binary,C#,File,Binary,在我的C#应用程序中,我必须读取大量二进制文件,但在第一次运行时,使用FileStream和BinaryReader读取这些文件需要很多时间。但第二次运行应用程序时,读取文件的速度要快4倍 读完这篇文章后,我决定对二进制文件进行预缓存 在阅读了另一篇文章“”之后,我的应用程序现在可以检测它是否是第一次运行,然后我使用这个简单的技术“”预缓存文件 有没有另一种方法可以预处理大量的二进制文件 编辑: 这就是我读取和解析文件的方式 f_strm = new FileStream(@location,

在我的C#应用程序中,我必须读取大量二进制文件,但在第一次运行时,使用FileStream和BinaryReader读取这些文件需要很多时间。但第二次运行应用程序时,读取文件的速度要快4倍

读完这篇文章后,我决定对二进制文件进行预缓存

在阅读了另一篇文章“”之后,我的应用程序现在可以检测它是否是第一次运行,然后我使用这个简单的技术“”预缓存文件

有没有另一种方法可以预处理大量的二进制文件

编辑:

这就是我读取和解析文件的方式

f_strm = new FileStream(@location, FileMode.Open, FileAccess.Read);
 readBinary = new BinaryReader(f_strm);

 Parse(readBinary);
Parse()函数只包含我用来解析数据的switch语句。 我不会做更复杂的事情。例如,我尝试读取和解析10.000个601KB的二进制文件,读取和解析这些文件花费了39秒和大约589.000个周期

当我再次运行该应用程序时,读取和解析最终花费了大约45000个周期和1.5秒

编辑
所谓“巨大”数量的文件,我指的是数百万个文件。情况并非总是这样,但大多数时候我都必须处理至少10000个文件。这些文件的大小可以在600Ko到700MB之间。

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


或者,制作一个
字典
,用于存储文件路径键入的文件内容。小心不要耗尽可用内存,否则你的应用程序将因分页而失败或变得非常慢。

我已编辑了你的标题。请看“”,其中的共识是“不,他们不应该”。好的,谢谢编辑。很抱歉,我建议只在需要的时候进行缓存,因为缓存大量您可能不使用的信息是没有效率的。这是非常模糊的,所以很难第一次判断是什么导致读取速度减慢,可能会有很多(磁盘休眠、缓存)。你能发布一个例子或者一个简介结果来说明为什么它是慢的吗?在术语“巨大”中加上一个数字是非常重要的。对于一些人来说,这意味着很多MB,对于一些人来说意味着很多GB,对于其他人来说意味着很多TB或更多。你说“巨大”是什么意思?你能详细说明第一部分吗。如何进行操作系统缓存?任何与此相关的链接都会有帮助吗?操作系统会缓存您读取的数据。下一次读取将只是从操作系统缓存到应用程序缓冲区的memcpy。这在所有操作系统中都很常见。@usr我做了这个新的MemoryStream(File.ReadAllBytes(_PATH_TO_File));当我第二次运行应用程序时,它运行得非常好,速度非常快。如果它运行得很好,那么问题是什么?我的建议是,如果可能的话,只使用OS缓存,并将OthWise缓存作为字节[]。不需要记忆流。问题是“我做的对吗?”。我只是不想让它工作得很好,我还想确保我没有愚蠢地这样做。“是”或“否”可以回答这个问题,但我还想解释一下预缓存后到底发生了什么,因为读取非预缓存二进制文件和预缓存二进制文件之间的周期差大约是544000个周期,这对我来说是巨大的。