我有一个控制台应用程序,它每天运行数百次并从大文件中读取相同的数据(比如50个文件,总大小为3-4 Gb)。
我正在考虑制作一项Windows服务,该服务将数据缓存在内存中以加快访问速度并控制数据的生命周期(这50个文件的集合可能每天都有所不同)。
我将实现共享内存映射文件,以便控制台应用程序将从服务写入的内存中读取文件...
然而,还有另一个考虑因素。读取的数据每次都转换为.NET对象。
所以我的问题 - 有没有办法在内存中共享而非 .NET对象(列表)?
P.S。数据是手动序列化的一系列字节
答案 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对象(?)......但它可能比一遍又一遍地读取文件要好。