2012-03-07 57 views
2

我有一个控制台应用程序,它每天运行一百次,并从大文件中读取相同的数据(例如总大小为3-4 Gb的50个文件)。.NET是否有可能在进程之间共享大内存集合?

我想制作一个Windows服务,它将缓存数据在内存中,以加快访问速度,并控制数据的使用寿命(因为这50个文件的设置可能每天都有所不同)。

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

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

所以我的问题 - 有没有办法共享不是文件,但内存中的.NET对象(列表)?

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

+0

查看TomTom的回答。作为一种解决方法,如果它适合您的需求,您可以创建一个服务来管理数据并对该数据执行逻辑。如果只是简单地搜索或汇总,那么......您的控制台应用程序只需调用服务中的方法并处理该方法的结果。 – Polity 2012-03-07 12:14:51

+0

3-4 GB的内存?真?哎呀它伤害.. – Steve 2012-03-07 12:18:50

+0

@Polity - 如果我可以我不会打扰映射文件等逻辑本身每天改变100次。数据是静态的。这就是为什么我正在以我解释的方式做事... – 2012-03-07 19:47:22

回答

3

我只是将它作为提供套接字服务器的服务来实现,并让控制台exe只连接到服务并通过TCP/IP发出请求,并获得响应。很容易设置,因为你已经(每个问题)已经序列化排序,并且非常可扩展。该服务可以让所有内容都快乐地运行。你甚至可以让客户端和服务器是相同的exe - 只要检查Environment.UserInteractive何时开始决定是客户端还是服务器。

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

+0

Marc。你应该更好地阅读这个问题。我已经有解决方案映射的内存文件。我想知道是否有一种方法来映射对象,而不是文件...你的套接字的想法并没有真正的帮助 - 我仍然需要从字节中反序列化数百万个对象..你知道命名管道比tcp更快吗?所以你的观点是什么? – 2012-03-07 19:42:38

+2

@Bobb是的,你有* a *解决方案;有不止一个。你正在询问* managed *对象,而不是:你不能这样做(你现在必须做你正在做的事情);然而,我的答案只是“做一个不同的方式,如果你的问题不适合,那么很好 - 但我没有你的设置的知识,所以请不要嗤之以鼻。 ;很好;在我看到的大多数类似的场景中,我们也会为此提供中央节点,因此通过网络,因此套接字。如果所有本地,那么很棒! – 2012-03-07 19:54:11

+0

公平足够.... – 2012-03-08 02:26:56

3

有没有一种方法可以共享内存中的文件,但.NET对象(列表)?

挑剔 - 没有办法,分配的对象是在一个特定的过程。

你可以像远程处理一样,但你基本上可以在进程之间编组访问。

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

+0

内存映射文件现在是管理对象。 – 2012-03-07 19:48:44

+0

啊 - 是的,没有。文件是,但不是其中的对象。海报已经讨论过mem映射文件,问题在于,对于一​​个文件,您必须在每次读取时都对结构或对象进行编组。他们没有提供用gc和所有这些共享类实例的方法 - 而且它们是关于分片对象的。共享数据空间 - 是的。不同的问题。 – TomTom 2012-03-08 05:53:18

1
  • 如果运行这个程序,每天百遍,你正在寻找一种方式,内存保持了“数据”你为什么不保持你运行的应用程序,而不是将其关闭并重新启动它?

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

  • 另一种解决方案是,而不是保留在内存对象(它只能使用.Remoting或类似的东西),为什么不您将文件导入数据库,这将加快流程,并且可以在流程之间轻松共享?

0

据我所知,你不能直接份额多个.NET进程之间的集合,但将不得不元帅跨进程边界的数据。这具有相当大的CPU开销,并且会消耗缓存进程和客户端中的对象的内存。

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

我不太喜欢.NET memory mapped files,本地代码的伟大之处在于,您只需将文件视为内存指针,而将其视为内存指针。你需要调用访问器方法,并因此将内存复制到.NET对象中(?)......但它可能比重复读取文件更好。

+0

这正是我要做的。阅读这个问题:“我要实现共享内存映射文件”.... – 2012-03-07 19:37:52

相关问题