Уменьшите отпечаток памяти, когда приложение Java читает гигантский файл в виде фрагментов - PullRequest
0 голосов
/ 14 марта 2011

Я создаю приложение для загрузки данных на сервер.Данные будут довольно огромными, до 60-70 Гб.Я использую Java, так как мне нужно, чтобы он работал в любом браузере.

Мой подход примерно такой:

InputStream s = new FileInputStream(file);
byte[] chunk = new byte[20000000];
s.read(chunk);
s.close();
client.postToServer(chunk);

На данный момент он использует большой объем памяти, постоянно поднимается коколо 1 ГБ, и когда сборщик мусора попадает, это ОЧЕНЬ очевидно, 5–6-секундный разрыв между блоками.

Есть ли способ улучшить производительность и сохранить объем памяти на достойном уровне?

РЕДАКТИРОВАТЬ:

Это не мой настоящий код.Есть много других вещей, которые я делаю, например, вычисление CRC, проверка по возвращаемому значению InputStream.read и т. Д.

Ответы [ 3 ]

1 голос
/ 14 марта 2011

Вам нужно подумать о повторном использовании буфера, что-то вроде этого:

int size = 64*1024; // 64KiB
byte[] chunk = new byte[size];
int read = -1;
for( read = s.read(chunk); read != -1; read = s.read(chunk)) {
  /*
   * I do hope you have some API call like the thing below, or at least one with a wrapper object that 
   * exposes partially filled buffers. Because read might not be the size of the entire buffer if there
   * are less than that amount of bytes available in the input stream until the end of the file...
   */
  client.postToServer(chunk, 0, read);
}
0 голосов
/ 14 марта 2011

Можно попробовать настроить сборщик мусора (http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html, http://www.petefreitag.com/articles/gctuning/)

0 голосов
/ 14 марта 2011

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

Также: почему вы используете такой огромный буфер? Из этого ничего не получится (если у вас нет безумно быстрого сетевого подключения и жесткого диска). Уменьшение до 64k , если не окажет негативного влияния на производительность и может помочь Java с GC.

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