2015-08-08 7 views
0

Что происходит, когда я пытаюсь использовать объект класса NamedPipeServerStream для передачи 1 ГБ данных, вызвав его метод Write()? Особенно, если данные не сразу потребляются клиентом. Где хранятся данные?Трубы для переноса больших данных

Каковы хорошие методы передачи большого количества данных с использованием труб? Разделить его на меньшие куски и реализовать какой-то протокол связи?

Есть ли лучшие альтернативы трубам? Я бы хотел избежать записи на жесткий диск.

+0

Почему бы вам не попробовать и не выяснить? Моя личная догадка заключается в том, что большая запись в трубу будет довольно быстро зависать, ожидая, что читатель будет потреблять данные на другом конце. Таким образом, трубы дают вам автоматический протокол. –

+0

Например, клиент попытается прочитать меньшие фрагменты (скажем, 1K), которые потребуют некоторого времени, в то время как данные записываются все сразу, и все эти данные должны куда-то перемещаться. Могут быть и другие сценарии, о которых я не могу сейчас думать. – mcu

+0

Итак, вы говорите, что 1 ГБ данных не проблема, если клиент читает все это за один раз? – mcu

ответ

1

Вы можете использовать файлы с отображением памяти для таких вещей. Они отлично работают для IPC. См. here.

Я предположил, что ваши процессы взаимодействуют внутри одной машины.

EDIT: Или вы можете просто пойти на розетки.

EDIT: У меня была реализация с использованием именованных каналов и была не очень стабильной, поэтому я отказался от нее, переключившись на файлы с отображением памяти. Если вы все еще хотите придерживаться именованных каналов, вы можете разделить свою нагрузку на куски, которые могут быть добавлены заголовком с некоторой релевантной информацией (например, размером блока, индексом куска, общим количеством кусков и т. Д.), А затем ожидать подтверждение от клиента перед написанием следующего фрагмента.

+0

Память сопоставленных файлов звучит неплохо, но имеет большой объем памяти. Я не знаю, сколько памяти на самом деле используется трубой при передаче 1 ГБ данных. – mcu

+0

Но опять же, хранение данных в массиве локальных байтов займет вдвое больше места памяти - один раз на стороне сервера и один раз на стороне клиента. Поэтому я думаю, что файлы с отображением памяти могут быть хорошим ответом, если сервер и клиент находятся на одной машине. – mcu

+0

О области памяти, помните, что файл страницы Windows также существует, что приходит на помощь с некоторыми дополнительными концертами на любом современном ПК. –