write (byte [] b) оптимальное использование для массива байтов - PullRequest
3 голосов
/ 20 сентября 2011

Если у меня уже есть большой байтовый массив в памяти, полученный из ответа SOAP.

Я должен записать этот байтовый массив в OutputStream.

Можно использовать только запись:

byte [] largeByteArray=...;

outputstream.write(largeByteArray);

...
outputstream.flush();
...

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

Ответы [ 5 ]

5 голосов
/ 20 сентября 2011

Если вы уже получили большой массив, просто запишите его - если реализация выходного потока решит разделить его на части, it может принять это решение. Я не вижу выгоды в том, что вы делаете это для этого - что может сделать его менее эффективным, если оно способно обрабатывать большие куски.

4 голосов
/ 20 сентября 2011

Если вы хотите сделать это более эффективным, я бы записывал данные по мере их получения, а не создавал большой байт [] (и ждал до конца, чтобы начать писать). Если это вариант, это может быть быстрее и эффективнее. Однако, если это не вариант, используйте одну большую запись.

2 голосов
/ 20 сентября 2011

Какой тип выходного потока вы используете?Существуют выходные потоки, которые могут записывать массив в виде фрагментов.В целом, я считаю, что если вы выполняете операцию ввода-вывода (записи) для каждого отдельного байта, производительность может быть низкой, поскольку операции ввода-вывода стоят дорого.

1 голос
/ 20 сентября 2011

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

0 голосов
/ 20 сентября 2011

Если largeByteArray является чем-то действительно большим, и работа записи стоит много времени, а память является значительным условием:

  • Разделить массив на части, после записи одной части установитьpart = null, это освобождение ссылки на часть, сделает JVM / GC частью как можно скорее.

  • Разделяя и выпуская, вы можете сделать больше записи (largeByteArray) одновременно, до появления OOM-ERROR.

  • Примечание: на этапе разделения JVM для этого требуется двойной массив памяти, но после разделения исходный массив в конечном итоге получит GC'd, вы вернулись к использованию того же объема памяти, что и раньше.

  • Пример: сервер имеет 1 ГБ памяти.он может запустить до 100 потоков, каждый из которых содержит и отправляет данные 10 МБ клиенту в одно и то же время.

    если вы используете большой массив 10 МБ, использование памяти всегда составляет 1 ГБ, ни одна запасная часть, даже если весь поток не имеет данных 1 МБ, не отправлено.

    Мое решение разделено на 10 МБ до 10 * 1 МБ.после отправки некоторой части MB отправленная часть может получить JVM / GC, и каждый поток стоит меньше среднего объема памяти за все время жизни.так что сервер может выполнять больше задач

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...