从内存中读取和在桌面上读取文件的性能差异

时间:2018-05-22 13:07:19

标签: c# filesystems filestream streamreader memorystream

我正在开发一个c#项目,我有一些文本文件(大约30mb) 该程序从游戏客户端中提取这些文件。然后将内容存储在内存(列表)中以供使用。 所以我正在处理的过程是:

  1. 解析游戏客户端。
  2. 将内容保存为目录中的txt文件。
  3. 使用流阅读器逐行阅读内容并将每行存储在列表中。
  4. 但是我最终使用了大约100MB ram的程序,这有点太多了,因为程序本来就是一个运行多个帐户的机器人(预计会有20个帐户,所以我相信大约2GB ram)。 / p>

    如果我解析游戏客户端然后保存txt文件然后在需要时从txt文件中读取而不将内容存储在内存中会不会更好?或者表现会更差?

2 个答案:

答案 0 :(得分:1)

您可能会考虑使用内存映射文件。他们做他们听起来像。您将一段内存映射到磁盘文件;您访问内存但实际上是在触摸底层磁盘文件。好处是,如果您使用.Net文件操作,您可以绕过一些正常的(性能吸收)文件I / O开销,并且您的代码看起来很干净,因为您只是按照自己的意愿行事。 #39; d总是这样做 - 在内存中编写针对对象的代码,而不是编写用于读写文件的类。

如果您熟悉虚拟内存中操作系统页面的操作方式,您可能会想到内存映射文件的一种方法。我在这里概括,但这不是一个坏的比喻。

查看Working with memory mapped files in .Net

答案 1 :(得分:0)

答案是......这取决于你的用例。

如果您经常在程序运行时引用存储在这些文件中的值,并且这些文件不是太大,则将它们存储在内存中通常是有意义的。与从磁盘读取相比,您获得的访问速度更快。

这种问题的一种常用解决方案是使用缓存(例如,如果您拥有的值多于可以存储在内存中的值)。

您可以限制缓存的大小并在那里存储最常用的变量。让你的程序首先尝试从缓存中读取 - 如果它想要的值存在(命中),那么就完成了工作。如果该值不是(未命中),则将从磁盘获取该值并将其放入缓存中以供将来参考。

如果它开始变得过满,可以从缓存中逐出旧的或不常用的值。

如果您使用公共数据运行同一程序的多个实例,则可以使用Redis等程序作为它们所引用的缓存。 (即一个100mb的实例,而不是100mb x机器人数)