0

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

方法1:在两个程序中内存映射同一个文件:CreateFileMapping() / MapViewOfFile()

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

方法 2:创建命名数据段

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

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

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

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

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

  • 内存映射文件有多快?(大致数量级)

  • 有没有更快的方法?

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

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

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

4

1 回答 1

2

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

于 2012-11-29T15:04:01.093 回答