2010-03-30 91 views
2

我的.NET程序需要运行大量使用第三方库(32位)的算法,其中大部分是非托管代码。我想尽我所能驱动CPU,因此代码并行运行多个线程来划分工作。在.NET中父进程和子进程之间的IPC建议?

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

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

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

回答

0

如果您使用WPF,可以使用许多常见形式的IPC。这可以通过配置文件更改所需的全部内容来完成,并且还可以跨机器边界进行通信。

2

.NET 3.0+中的IPC可以通过WCF和命名管道绑定完成。最明显的好处是你可以通过简单地切换绑定来将繁重的任务分配到各台机器上。更多关于这个here

关于内存占用情况,您可能会尝试让您的第三方库以64位方式运行,并在64位操作系统上运行您的内核以获得更多可用于您的进程的内存。

+0

使用32位操作系统,您还可以通过在2000/XP中使用/ 3GB boot.ini开关和在Vista/7中使用IncreaseUserVa,为应用程序添加另一千兆字节的可用内存。 – 2010-04-28 10:01:57

0

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

既然你有很多的RAM,你可以做的另一件事(不需要有多个进程)是使用PAE(物理地址扩展),然后你的进程可以处理8 GB以上。请参阅here

正如其他人建议您可以使用.NET远程处理(如果客户端和服务器都是.NET,可以在同一台机器或远程本地)。 PS:这个答案很晚,可能是你的要求已经完成了,但是我把它发布在这里供其他人稍后使用这个线程。