Передача большого байтового массива клиенту - PullRequest
0 голосов
/ 19 апреля 2011

Позвольте мне представить мою ситуацию.

У меня много данных в байтах, хранящихся в файлах на сервере.Я пишу и читаю эти файлы, используя AIO, который входит в JDK7.Таким образом, я использую ByteBuffer (s) для операций чтения и записи.

Вопрос заключается в том, что, как только я произвел чтение в AsynchronousFileChannel, я хочу передать содержимое ByteByffer, которое использовалось в операции чтения, клиенту.Таким образом, я действительно хочу отправить байты.

Какой самый лучший путь отсюда.Я не хочу отправлять ByteBuffer, потому что у меня есть их пул, который я использую повторно, поэтому это не вариант.Я также хочу иметь возможность даже объединить несколько операций чтения и отправить содержимое нескольких байтовых буферов одновременно.

Итак, что я отправляю.Просто массив byte []?Или мне нужен поток?Что может быть лучшим решением в отношении производительности здесь.

Я использую RMI для связи.

Спасибо заранее.

Ответы [ 3 ]

1 голос
/ 19 апреля 2011

Вы можете смоделировать потоки через rmi, используя библиотеку RMIIO , которая позволит вам передавать произвольное количество байтов через RMI, не вызывая проблем с памятью ни на одном конце.

(отказ от ответственности, я написал библиотеку)

0 голосов
/ 19 апреля 2011

Чтобы использовать RMI, вы должны извлечь содержимое буфера как byte[], а затем записать его в ObjectOutputStream (запись происходит под прикрытием). Предполагая, что вы в настоящее время используете прямые буферы, это означает время ЦП для создания массива в куче Java и время ЦП для сбора мусора этого массива после его записи, а также возможность того, что поток будет слишком долго удерживать ссылку , вызывая ошибку нехватки памяти.

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

0 голосов
/ 19 апреля 2011

Если нет веских причин не делать этого, просто отправьте байтовый массив вместе с достаточным количеством метаданных, чтобы вы могли обеспечить надежный сервис.

Меньше базовой реализации вам нужно передавать взад и впередчерез RMI, тем лучше.Особенно, когда вы работаете с Java 7, который пока недоступен.

...