将大型float []写入命名管道(或文件)

时间:2016-03-16 18:06:27

标签: c# named-pipes

我正在寻找一种在两个进程之间推送大量数据的方法。 数据块是托管float []数组的blob。

目前我使用命名管道在两个进程之间移动数据。它工作得很好。但不幸的是,我似乎需要将float []数组复制到一个字节数组中才能使用NamedPipe.Write。

每个blob都是> 128MB,所以我更喜欢找到一个没有额外复制缓冲区的解决方案。 有没有办法在不必复制的情况下获得相同的结果?

我希望有类似的东西:

unsafe{
  fixed(float* fp = myfloatarray){
     pipe.UnsafeWrite(fp, ...)
  }
}

我确实四处寻找是否可以获取管道文件句柄并使用WriteFile pinvoke。看起来乱七八糟的实时管理的namedpipe实例的文件句柄正在寻找麻烦。

非常欢迎任何提示!

2 个答案:

答案 0 :(得分:0)

使用内存映射文件可能更有意义吗? https://msdn.microsoft.com/en-us/library/dd997372(v=vs.110).aspx

答案 1 :(得分:0)

我看了一下pipestream类的源代码,发现内部的'Write'方法只是绕过Win32 WriteFile。所以我的猜测是下面的代码应该完全正常:

unsafe
{
    fixed(float* fp = myfloatarray)
    {
           WriteFile(pipe.SafePipeHandle,(byte*)fp,buffer.Length*sizeof(float), out written);
    }
 }

[DllImport("kernel32.dll", SetLastError = true)]
    static unsafe extern int WriteFile(
        SafeHandle handle,
        byte* bytes,
        uint numBytesToWrite,
        out int numBytesWritten,
        System.Threading.NativeOverlapped* lpOverlapped = null);