我正在寻找一种在两个进程之间推送大量数据的方法。 数据块是托管float []数组的blob。
目前我使用命名管道在两个进程之间移动数据。它工作得很好。但不幸的是,我似乎需要将float []数组复制到一个字节数组中才能使用NamedPipe.Write。
每个blob都是> 128MB,所以我更喜欢找到一个没有额外复制缓冲区的解决方案。 有没有办法在不必复制的情况下获得相同的结果?
我希望有类似的东西:
unsafe{
fixed(float* fp = myfloatarray){
pipe.UnsafeWrite(fp, ...)
}
}
我确实四处寻找是否可以获取管道文件句柄并使用WriteFile pinvoke。看起来乱七八糟的实时管理的namedpipe实例的文件句柄正在寻找麻烦。
非常欢迎任何提示!
答案 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);