内存映射文件与 RAM 磁盘

5 .net c# filesystems memory-mapped-files ramdisk

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

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

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

  • 内存映射文件是否可以以相同的方式运行,IE 创建一个虚拟驱动器,我可以创建一个符号链接?如G:\Data_Files\?

  • 是否有其他带有 .NET API/绑定的 Dokan/ImDisk 替代方案?

Eug*_*its 3

有多种方法取决于您任务的具体情况。

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

如果您需要的只是使用 Stream 类方便地管理内存中的一堆文件(可以将所有这些文件刷新到磁盘),那么您可以使用其中一个虚拟文件系统。我们的SolFS(应用版)就是您可以使用的此类产品之一(我还记得CodeBase File System,但他们似乎没有提供评估版本)。SolFS 似乎非常适合您的任务,因此如果您也这么认为,您可以私下联系我(请参阅我的个人资料)以获取帮助。

回答您的问题:

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

  2. 我们的回调文件系统或回调磁盘产品(请参阅虚拟存储系列)是一种替代方案,但是,正如我在第一段中提到的,由于用户模式上下文切换,它们不会解决您的问题。

更新: 我认为驱动程序在内存中拥有副本并在需要时异步写入磁盘没有任何障碍。但这需要修改示例 RAMDisk 驱动程序(这涉及大量内核模式编程)。

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