.NET中父级和子级进程之间的IPC建议?

时间:2010-03-30 20:42:58

标签: .net ipc

我的.NET程序需要运行一个大量使用第三方库(32位)的算法,其中大部分都是非托管代码。我想尽可能地驱动CPU,因此代码并行运行几个线程来分割工作。

我发现同时运行所有这些线程会导致临时内存峰值,导致进程的虚拟内存大小接近2 GB的限制。这个内存很快就被释放了,但偶尔如果有足够的线程一次进入错误的代码段,则该过程会穿过“红线”,并且非托管代码或.NET代码会遇到内存不足错误。我可以减少线程的数量但是我的CPU使用率没有我想要的那么高。

我正在考虑创建工作进程而不是工作线程来帮助避免内存不足错误,因为这样做会给每个执行线程带来2 GB的虚拟地址空间(我的盒子有很多RAM)。我想知道在.NET中的进程之间传递输入和输出的最佳/最简单方法是什么?

文件系统是一个显而易见的选择。我习惯于从UNIX背景中共享内存,命名管道等。我应该使用Windows或.NET特定的机制吗?

3 个答案:

答案 0 :(得分:2)

.NET 3.0+中的IPC可以使用WCF和命名管道绑定来完成。最明显的好处是,您只需切换绑定即可跨机器分割繁重的任务。有关here的更多信息。

关于内存占用,您可以尝试使用64位的第三方库,并在64位操作系统上运行您的内容,以获得更多可用于您的进程的内存。

答案 1 :(得分:0)

如果您使用WPF,可以使用许多常见形式的IPC。这可以通过这样的方式完成,即配置文件更改是所需的全部,并为跨机器边界进行通信留出了空间。

答案 2 :(得分:0)

是的,你是对的。分成几个进程而不是线程会有所帮助,因为每个进程都有自己的2GB虚拟空间(在32位系统上)。

由于你有大量的RAM,你可以做的另一件事(不需要多个进程)是使用PAE(物理地址扩展),然后你的进程可以解决超过8 GB的问题。见here

正如其他人所建议您可以使用.NET远程处理(如果客户端和服务器都是.NET,可以是同一台机器或远程本地)。

PS:这个答案很晚,可能是你的要求已经完成,但我在这里发布,供其他人以后使用这个帖子。