Почему скорость загрузки файлов с использованием Java так низка - PullRequest
8 голосов
/ 22 мая 2011

Я написал простой Java Downloader, и у меня есть некоторые проблемы со скоростью.

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

Мой код:

InputStream is = null;
FileOutputStream os = null;
os = new FileOutputStream(...);
URL u = new URL(...);
URLConnection uc = u.openConnection();
is = uc.getInputStream();
final byte[] buf = new byte[1024];
for(int count = is.read(buf);count != -1;count = is.read(buf)) {
    os.write(buf, 0, count);
}

Что я должен сделать, чтобы максимизировать скорость загрузки?

ОБНОВЛЕНИЕ

Размеры файлов варьируются от 1 до 100 МБ.Я увеличил буфер до 65536, чтобы он был таким же.

Об измерении: я проверяю каждые 3 секунды, сколько байтов было записано, а затем делю его на 3 и на 1024 - это дает мне кб / с

1 Ответ

5 голосов
/ 25 мая 2011

Чтобы увеличить скорость, вплоть до ограничения вашей пропускной способности и емкости сервера, приложение должно использовать несколько соединений (более одного) с многопоточным кодом: каждый поток создает свое собственное соединение и запрашивает части файла.

Примером такого приложения является IBM download Director , который часто использует три HTTP-соединения для извлечения больших файлов.Большинство FTP-клиентов также могут работать с несколькими подключениями для увеличения пропускной способности.В Java для написания такого многопоточного приложения можно использовать Apache HttpClient .

Вы не указали подробности протокола, используемого в вашем URL.Если HTTP, запрос HEAD возвращает длину файла, а GET с поддержкой чанкования используется для запроса частей файла.

Вероятно, вы можете получить лучшую производительность даже при одном подключении, если вы напрямую используете HttpURLConnection иустановите значение для ChunkedStreamingMode.

Если вы все еще не удовлетворены, пожалуйста, предоставьте дополнительную информацию:

  • что означает ваше «Но через некоторое время», вы загружаете много файлов в последовательности?
  • что за протокол?Вы используете определенный URLStreamHandler?
  • проверили ли вы использование памяти JVM и сборку мусора?
  • ваша рабочая станция может быть занята чем-то другим: используется ЦП, пропускная способность сети используется чем-то другим, антивирус замедляет доступ к диску?
  • Вы проходите через прокси-сервер: некоторые HTTP-прокси могут уменьшить пропускную способность через несколько минут на том же соединении ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...