我正在开发一个c#项目,我有一些文本文件(大约30mb) 该程序从游戏客户端中提取这些文件。然后将内容存储在内存(列表)中以供使用。 所以我正在处理的过程是:
但是我最终使用了大约100MB ram的程序,这有点太多了,因为程序本来就是一个运行多个帐户的机器人(预计会有20个帐户,所以我相信大约2GB ram)。 / p>
如果我解析游戏客户端然后保存txt文件然后在需要时从txt文件中读取而不将内容存储在内存中会不会更好?或者表现会更差?
答案 0 :(得分:1)
您可能会考虑使用内存映射文件。他们做他们听起来像。您将一段内存映射到磁盘文件;您访问内存但实际上是在触摸底层磁盘文件。好处是,如果您使用.Net文件操作,您可以绕过一些正常的(性能吸收)文件I / O开销,并且您的代码看起来很干净,因为您只是按照自己的意愿行事。 #39; d总是这样做 - 在内存中编写针对对象的代码,而不是编写用于读写文件的类。
如果您熟悉虚拟内存中操作系统页面的操作方式,您可能会想到内存映射文件的一种方法。我在这里概括,但这不是一个坏的比喻。
答案 1 :(得分:0)
答案是......这取决于你的用例。
如果您经常在程序运行时引用存储在这些文件中的值,并且这些文件不是太大,则将它们存储在内存中通常是有意义的。与从磁盘读取相比,您获得的访问速度更快。
这种问题的一种常用解决方案是使用缓存(例如,如果您拥有的值多于可以存储在内存中的值)。
您可以限制缓存的大小并在那里存储最常用的变量。让你的程序首先尝试从缓存中读取 - 如果它想要的值存在(命中),那么就完成了工作。如果该值不是(未命中),则将从磁盘获取该值并将其放入缓存中以供将来参考。
如果它开始变得过满,可以从缓存中逐出旧的或不常用的值。
如果您使用公共数据运行同一程序的多个实例,则可以使用Redis等程序作为它们所引用的缓存。 (即一个100mb的实例,而不是100mb x机器人数)