2016-03-16 3 views
0

Я ищу способ выталкивать большие объемы данных между двумя процессами. Блоки данных представляют собой капли управляемого массива float [].Напишите большой массив float [] в именованный канал (или файл)

В настоящее время я использую именованные каналы для перемещения данных между обоими процессами. Он отлично работает. Но, к сожалению, мне кажется, мне нужно скопировать массив float [] в массив байтов, прежде чем я смогу использовать NamedPipe.Write.

Капли по 128 Мбайт каждый, поэтому я предпочитаю найти решение, которое работает без дополнительного буфера копирования. Есть ли способ добиться того же результата без необходимости делать копию?

Я надеялся на что-то вроде:

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

я тыкать вокруг, чтобы увидеть, если я мог бы получить файл трубы ручку и использовать WriteFile PInvoke. Похоже, что возиться с файловым дескриптором реального управляемого экземпляра namedpipe запрашивает проблемы.

Любые советы приветствуются!

+0

Проверьте это: https://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeserverstream(v=vs .110) .aspx – CodingGorilla

ответ

0

Возможно, имеет смысл использовать файлы с отображением памяти? https://msdn.microsoft.com/en-us/library/dd997372(v=vs.110).aspx

+0

Для этого я просмотрел файлы с памятью. К сожалению, общий WriteArray внутренне просто записывает каждый элемент в массиве аргументов T [] отдельно. Для 64M-элемента float [] массив, это будет означать 64M записи вызовов. Используя этот метод, я получаю только около 250 Мбайт/с пропускной способности. – NWit

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); 
Смежные вопросы