C# 将浮点[]的大数组写入命名管道(或文件)

C# 将浮点[]的大数组写入命名管道(或文件),c#,named-pipes,C#,Named Pipes,我正在寻找一种在两个进程之间推送大量数据的方法。 数据块是托管float[]数组的blob 目前,我使用命名管道在两个进程之间移动数据。它工作得非常好。但不幸的是,在使用NamedPipe.Write之前,我似乎需要将float[]数组复制到字节数组中 每个blob都>128MB,因此我更愿意找到一个不需要额外复制缓冲区的解决方案。 有没有什么方法可以在不复制的情况下达到同样的效果 我希望有这样的事情: unsafe{ fixed(float* fp = myfloatarray){

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

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

每个blob都>128MB,因此我更愿意找到一个不需要额外复制缓冲区的解决方案。 有没有什么方法可以在不复制的情况下达到同样的效果

我希望有这样的事情:

unsafe{
  fixed(float* fp = myfloatarray){
     pipe.UnsafeWrite(fp, ...)
  }
}
我确实四处打探,看看是否可以得到管道文件句柄并使用WriteFile pinvoke。看起来,摆弄活动托管namedpipe实例的文件句柄是在自找麻烦


欢迎任何提示

也许使用内存映射文件更有意义?

我查看了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);

看看这个:我看了一下这个的内存映射文件。不幸的是,泛型WriteArray在内部只是将参数T[]数组的每个元素单独写入。对于64M元素float[]数组,这意味着64M写调用。使用这种方法,我只能获得大约250MB/s的吞吐量。