繁体   English   中英

内存映射文件与 RAM 磁盘

[英]Memory-Mapped Files vs. RAM Disk

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

在最近的一次尝试中,我尝试使用 Dokan/ImDisk 以编程方式为服务器应用程序创建 RAMDisk。 Dokan 比普通硬盘慢得多,我无法正确地将 ImDisk 安装到 function。 由于这些是我所知道的仅有的两个文件系统驱动程序,它们具有 .NET API,我现在正在寻找替代方案。

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

  • 内存映射文件 function 可以以同样的方式创建一个虚拟驱动器,我可以创建一个符号链接吗? 如 G:\Data_Files\?

  • 是否有其他 Dokan/ImDisk 替代品与 .NET API/绑定浮动?

在查看了一堆解决方案并进行了一些基准测试之后,我们无法放弃DataRam 的 RAMDisk 我们使用了一堆 Windows 驱动程序和其他一些免费赠品解决方案,最终无法证明与商业解决方案的微小价格标签相比的费用是合理的。

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

如果您需要使用文件系统(即通过文件系统 API 函数和类),并且想要快速,那么(正如我在回复您之前的问题时建议的那样)您需要创建一个 RAMDisk 驱动程序。 Windows 驱动程序套件包括一个示例驱动程序,(巧合?)名称为“RamDisk”。 但是,驱动程序开发很棘手,如果示例出现问题或者您需要对其进行扩展,您将需要深入研究内核模式开发(或聘请某人来完成这项工作)。 为什么是 kernel 模式? 正如您在 Dokan 中看到的那样,切换回用户模式来存储数据会导致严重的减速。

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

要回答您的问题:

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

  2. 我们的 Callback File System 或 CallbackDisk 产品(参见virtual storage line)是一种替代方案,但是,正如我在第一段中提到的,由于用户模式上下文切换,它们不会解决您的问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM