Что относительно того, чтобы буферизовать FileInputStream?

У меня есть часть кода, который читает адскую партию (сотни тысячи) относительно маленьких файлов (несколько КБ) от локальной файловой системы в цикле. Для каждого файла существует a java.io.FileInputStream созданный для чтения содержания. Процесс его очень медленное и берет возрасты.

Вы думаете что, перенося FIS в java.io.BufferedInputStream имел бы значительное значение?

9
задан skaffman 21 May 2010 в 12:44
поделиться

3 ответа

Если вы еще не используете байт[] буфер приличного размера в цикле чтения/записи (последняя реализация BufferedInputStream использует 8KB), то это несомненно будет иметь значение. Попробуйте сами. Не забудьте сделать любой OutputStream также BufferedOutputStream .

Но если вы уже буферизировали его с помощью byte[] и/или это, в конце концов, мало что меняет, значит, узким местом является скорость жесткого диска и контроллера ввода-вывода.

9
ответ дан 4 December 2019 в 13:45
поделиться

Я очень сомневаюсь, что это будет иметь значение.

Ваша основная проблема - это сотни тысяч крошечных файлов. Их чтение заставит диск перегружаться и будет длиться вечно, независимо от того, как вы это делаете, вы потратите 99,9% времени на ожидание механического движения внутри жесткого диска.

Есть два способа исправить это:

  • Сохранить данные на SSD - у них намного меньше (на пять порядков меньше) задержка.
  • Разместите данные в несколько больших файлов и прочитайте их последовательно
3
ответ дан 4 December 2019 в 13:45
поделиться

Это зависит от того, как вы читаете данные. Если вы читаете из FileInputStream очень неэффективным способом (например, вызывая read () побайтно), то использование BufferedInputStream может значительно улучшить ситуацию. Но если вы уже используете буфер разумного размера с FileInputStream, переключение на BufferedInputStream не имеет значения.

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

3
ответ дан 4 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: