在Windows中将大量数据从一个程序发送到另一个程序的最快方法?

时间:2012-11-28 21:21:29

标签: windows ipc pipe shared-memory memory-mapped-files

我需要在Windows 7中从一个程序向另一个程序发送大量数据(~10MB)。我想要一种方法,允许每秒至少一千兆字节的总吞吐量和非常低的系统负载。为了简化这一点,所有blob的大小可能相同,一个程序可能是另一个程序的子进程。

方法1:Memory map the same file in both programs:CreateFileMapping()/ MapViewOfFile()

在这种情况下,内存映射文件可能包含环形缓冲区中几个blob的空间。需要一些外部机制来同步对环形缓冲区的访问。

方法2:Create named data sections

方法3:WriteProcessMemory(由Hristo Iliev建议,谢谢!)

方法4:在RAM磁盘上读/写文件。

方法5:读取/写入匿名管道。

方法?:还有别的吗?也许通过TCP写,使用MPI,......

我知道内存映射文件(方法1)被认为是解决此问题的标准方法:)

  • 内存映射文件的速度有多快? (粗略的数量级)

  • 是否有更快的方法?

  • 其他方法的表现差多少?哪些可以达到GB /秒吞吐量?

  • 如果使用内存映射文件,程序同步访问传递数据的最佳方法是什么? (即:生产者如何向消费者表明新的blob可用,以及消费者如何表明它是用特定的blob完成的?)

  • 如果使用内存映射文件,最好是将所有blob的一个文件放在一起(文件中的环形缓冲区),还是每个blob一个文件(文件的环形缓冲区)?

1 个答案:

答案 0 :(得分:2)

您还可以使用WriteProcessMemory并让第一个过程直接将数据发布到第二个进程的地址空间中。你需要开发某种协议。例如,第二个进程可以通过命名管道或共享内存块将其接收缓冲区的虚拟地址发送到第一个进程,然后第一个进程使用WriteProcessMemory复制数据,当它完成时,发出信号第二个通过信号量或其他东西。这应该是在两个进程之间发送数据的最快方式,因为它涉及单个复制操作。第一个进程需要获得第二个进程的适当权限,只要两个进程属于同一个用户,就不应该成为问题。