【问题标题】:Fastest way to send large blobs of data from one program to another in Windows?在 Windows 中将大量数据从一个程序发送到另一个程序的最快方法是什么?
【发布时间】:2012-11-28 21:21:29
【问题描述】:

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

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

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

方法二:Create named data sections

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

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

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

方法?:还有什么?也许通过 TCP 编写,使用 MPI,...

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

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

  • 有更快的方法吗?

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

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

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

    李>

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 有趣的方法,我知道有一些我没有想到的选项。 WriteProcessMemory 是否可能比 MapViewOfFile 快​​?在任何一种情况下都假定存在另一个用于同步传递数据的协议:)
    • @AlexI,没有太多关于WriteProcessMemory 内部工作的文档,但我认为这是在内核模式下直接进行数据复制。对于共享文件视图,必须首先将数据从第一个进程复制到共享区域,然后再将其从区域复制到第二个进程的内存中。除非可以在共享段内直接操作数据,否则这种双重复制过程可能会比 WPM 方法慢。
    • 顺便说一下,MPI 标准使用单向操作提供了类似的功能,但实现起来很尴尬(因为它必须非常便携)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多