用于本地 IPC 的基于内存的数据服务器

Posted

技术标签:

【中文标题】用于本地 IPC 的基于内存的数据服务器【英文标题】:Memory Based Data Server for local IPC 【发布时间】:2009-05-10 17:22:43 【问题描述】:

我要运行的应用程序每次运行都需要大约 200MB 的市场数据。 这些天来存储在内存中的数据量很小,所以为了速度,这就是我想要做的。

在一天的会话过程中,我可能会一遍又一遍地运行、重新运行、重写和重新运行等一个或多个应用程序。

所以,问题是如何将数据保存在内存中,这样即使应用程序崩溃,我也不必通过打开磁盘上的数据文件并重新加载数据来重新加载数据?

我最初的想法是编写一个数据服务器应用程序,它只会将数据读入共享内存,以便可以使用。如果我这样做,我想我可以通过调用来为 IPC 使用内存映射

创建文件()

CreateFileMapping()

MapViewOfFile()

有更好的 IPC/方法吗?

【问题讨论】:

内存映射是我工作过的交易系统执行此操作的方式。 【参考方案1】:

如果您有足够的内存并且没有其他东西需要内存,那可能会减少您的启动时间。为了保证对内存的访问,您可能希望在命名共享内存中拥有一个内存映射文件,如here 所述。您可以让一个简单的程序创建共享并对其进行管理,这样您就可以保证它保留在内存中。

【讨论】:

【参考方案2】:

只是内存映射数据文件。除非您的计算机内存不足,否则即使程序退出,文件也会保留在文件缓存中。下次启动时,访问速度会很快。

如果您的内存数据与磁盘数据不同,只需使用两个文件。重新启动时,检查写入内存文件的时间戳和文件修订以与磁盘文件进行比较,这样您的程序就会知道哪个具有最新数据。

【讨论】:

如果我理解正确,您是在建议单个应用程序可以在退出时将数据留在内存中?不确定这将如何工作,因为应用程序调用 UnmapViewOfFile pData CloseHandle hFileMapping CloseHandle hSys @Mike - 我不是 Windows 人,所以我不确定它的内存映射工具是否有一些选项可以在程序结束后保持持久性。毫无疑问,它确实有某种对 mem 映射文件的引用计数。所以写一个小程序,除了在一天开始时加载文件之外什么都不做。当您运行您的真实应用程序时,操作系统应该只附加到您进行文件映射时已经在内存中的内容。 @Mike - 我是说操作系统会将未映射的文件数据保留在 RAM 中,除非它需要该内存用于其他用途。

以上是关于用于本地 IPC 的基于内存的数据服务器的主要内容,如果未能解决你的问题,请参考以下文章

嗅探内部活动——IPC 还是共享内存?

具有共享内存和文件作为数据库的 IPC V 客户端/服务器应用程序,用 C 编写

Linux上实现基于TCP和Unix domain Socket的本地IPC通信模型

Qt利用QLocalSocket和QLocalServer实现IPC

IPC之Posix信号量详解

Mono 和 .NET 中的 IPC