使用共享内存的最佳方式,该内存可以由不同的进程直接读取,而无需复制开销

本文关键字:内存 进程 读取 开销 复制 最佳 共享 方式 | 更新日期: 2023-09-27 18:24:01

我有一个应用程序,其中的初始化涉及从文件中读取非常大的数据(~>10 GB),然后对这些数据执行一些计算(其类型为Dictionary)。初始化步骤每次都需要几个小时,即使我的数据是固定的/从未更改过。我想做的是以某种方式使用一个进程将这些数据预加载到内存中,并在同一台机器上使用另一个进程直接从中读取所有数据一次,而不需要任何副本。到目前为止,我已经找到了几种方法:

  • 使用远程对象的.Net远程处理。然而,这种方法承担了封送成本,因此不适用于我的情况,因为数据传输会在某一点上产生两倍的内存。

  • 内存映射文件。这个选项似乎仍然需要数据复制,对于我的情况来说,这并不理想,因为我需要复制所有大于10GB的数据。我发现了一些关于使用不安全访问内存地址的文章,但我不知道这是怎么回事。

  • WCF命名管道。这种方法似乎类似于远程处理,但仍然需要数据传输。

对于我的场景,最有效的方法是什么?

使用共享内存的最佳方式,该内存可以由不同的进程直接读取,而无需复制开销

如果您要将数据放入字典中,为什么不使用任何流行的nosql键值存储(couchbase、riak、redis),那么任何进程都可以使用这些数据。如果您完全反对这种想法,您可以始终使用NancyFx框架在"host"应用程序中托管本地rest服务端点,那么任何其他需要使用预加载数据的应用程序都可以与主机提供的服务进行交互。

我不知道如何有效地在内存中保持10GB的数据。无论采用何种方法在内存中存储10GB的数据,都会过于频繁地使用系统缓存,并会降低整个系统的速度。

如果可以的话,我建议使用数据库。若不能使用数据库,请尝试存储初始化的数据,并在需要时通过一些缓存读取部分。