.NET是否有可能在进程之间共享大型内存中的集合?

时间:2012-03-07 12:02:44

标签: c# .net-4.0 ipc shared-memory

我有一个控制台应用程序,它每天运行数百次并从大文件中读取相同的数据(比如50个文件,总大小为3-4 Gb)。

我正在考虑制作一项Windows服务,该服务将数据缓存在内存中以加快访问速度并控制数据的生命周期(这50个文件的集合可能每天都有所不同)。

我将实现共享内存映射文件,以便控制台应用程序将从服务写入的内存中读取文件...

然而,还有另一个考虑因素。读取的数据每次都转换为.NET对象。

所以我的问题 - 有没有办法在内存中共享而非 .NET对象(列表)?

P.S。数据是手动序列化的一系列字节

4 个答案:

答案 0 :(得分:3)

  

有没有办法在内存中共享文件而不是.NET对象(List)?

挑剔 - 不,没有办法,分配对象是在特定进程上。

你可以使用像远程处理这样的东西,但是你基本上会在进程之间编组访问。

您可以共享非托管空间(共享内存),但这不能包含.NET对象 - 需要编组。

答案 1 :(得分:3)

我只是将其实现为提供套接字服务器的服务,并让控制台exe只连接到服务并通过TCP / IP发出请求,从而获得响应。非常容易设置,因为您已经(根据问题)已经对序列化进行了排序,并且具有很高的可扩展性。然后,该服务可以使所有内容在内存中快乐地运行。您甚至可以让客户端和服务器成为相同的exe - 只需检查Environment.UserInteractive何时开始决定是客户端还是服务器。

一个注意事项:保持低带宽,避免使用繁琐的API;意思是:没有客户做很多思考然后提出200个请求;只需将整个请求打包并将其发送到服务器即可。让服务器在本地担心这一切,避免大量网络流量。

答案 2 :(得分:1)

  • 如果您每天运行此应用程序一百次并且您正在寻找一种方法将“数据”保留在内存中,为什么不让您运行应用程序而不是关闭它并重新启动它?

  • 您可以创建一个Windows服务,将文件加载到内存中并对其进行详细说明。当然,如果您停止或重新启动服务,则需要重新加载数据

  • 另一个解决方案是,不要将内存对象(只能使用.Remoting或类似内容)保存在内存中,为什么不将文件导入数据库,这将加快进程的速度,它可以在进程之间轻松共享吗?

答案 3 :(得分:0)

据我所知,您不能直接在多个.NET进程之间共享集合,但必须跨进程边界封送数据。这会产生相当大的CPU开销,并且会占用缓存进程和客户端中对象的内存。

使用内存映射文件可能会更好一些,但是仍然不允许直接在共享内存上映射.NET对象 - 但是你说“数据是手动序列化的一系列字节”,所以它可能足够贴合吗?

我不太了解.NET memory mapped files,本机代码的优点在于您只是将文件视为内存指针,而使用.NET MMF则需要调用访问器方法,从而将内存复制到.NET对象(?)......但它可能比一遍又一遍地读取文件要好。