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