内存映射文件与RAM磁盘

时间:2011-08-13 10:32:21

标签: c# .net filesystems memory-mapped-files ramdisk

对于游戏Minecraft,运行服务器应用程序时的一般方法是在RAMDisk中运行它,因为它使用数百个小文件进行世界生成,而I / O速度是主要的瓶颈。

在最近的尝试中,我尝试使用Dokan / ImDisk以编程方式为服务器应用程序创建RAMDisk。 Dokan比普通硬盘慢得多,我无法让ImDisk正常运行。由于这些是我所知道的只有两个具有.NET API的文件系统驱动程序,我现在正在研究替代方案。

之前我曾提到尝试内存映射文件。我目前的方法是创建RAMDisk,在Game Server的数据文件夹和RAMDisk之间创建符号链接,然后启动游戏服务器进程。

  • 内存映射文件的功能是否相同,I.E。创建一个虚拟驱动器,我可以创建一个符号链接?例如G:\ Data_Files \?

  • Dokan / ImDisk是否还有其他替代品,其中包含.NET API / Bindings?

2 个答案:

答案 0 :(得分:3)

在查看了一堆解决方案并做了一些基准测试之后,我们无法通过RAMDisk from DataRam。我们踢了一堆Windows驱动程序和其他一些免费赠品解决方案,最终无法证明这笔费用与商业解决方案的微小价格相比。

答案 1 :(得分:2)

有几种方法取决于您的任务细节。

如果您需要使用文件系统(即通过文件系统API函数和类),并且您希望它快速,那么(正如我在回答您之前的问题时建议的那样)您需要创建一个RAMDisk驱动程序。 Windows Driver Kit包含一个示例驱动程序,(巧合?)的名称为“RamDisk”。但是,驱动程序开发很棘手,如果样本出现问题或需要扩展它,您需要深入研究内核模式开发(或雇用某人来完成工作)。为什么内核模式?因为你可以看到Dokan,切换回用户模式来存储数据导致重大减速。

如果您只需要使用Stream类对内存中的一堆文件进行方便管理(可以将所有这些文件刷新到磁盘),那么您可以使用其中一个虚拟文件系统。我们的SolFS (Application Edition)是您可以使用的产品之一(我也记得CodeBase文件系统,但它们似乎没有提供评估版本)。 SolFS似乎很适合你的任务,所以如果你这么认为,你可以私下联系我(见我的个人资料)寻求帮助。

回答你的问题:

  1. 不,内存映射文件(MMF)实际上是磁盘上的文件(如果有的话,包括虚拟磁盘),不能通过文件系统API访问,而是直接使用内存操作。对于大多数文件操作,MMF往往更快,这就是它们经常被提及的原因。

  2. 我们的回拨文件系统或CallbackDisk产品(请参阅virtual storage行)是另一种选择,但正如我在第一段中所提到的,由于用户模式上下文切换,它们无法解决您的问题。

  3. 更新的 我认为驱动程序没有障碍在内存中复制并在需要时异步执行写入磁盘。但这需要修改示例RAMDisk驱动程序(这涉及很多内核模式编程)。

    使用SolFS或其他虚拟文件系统,您也可以在磁盘上拥有存储的副本。对于虚拟文件系统,可能看起来使用磁盘上的容器文件会给您带来满意的结果(因为虚拟文件系统通常有内存缓存),您根本不需要保留内存中的副本。