У меня есть часть кода, который читает адскую партию (сотни тысячи) относительно маленьких файлов (несколько КБ) от локальной файловой системы в цикле. Для каждого файла существует a java.io.FileInputStream
созданный для чтения содержания. Процесс его очень медленное и берет возрасты.
Вы думаете что, перенося FIS в java.io.BufferedInputStream
имел бы значительное значение?
Если вы еще не используете байт[] буфер
приличного размера в цикле чтения/записи (последняя реализация BufferedInputStream
использует 8KB), то это несомненно будет иметь значение. Попробуйте сами. Не забудьте сделать любой OutputStream
также BufferedOutputStream
.
Но если вы уже буферизировали его с помощью byte[]
и/или это, в конце концов, мало что меняет, значит, узким местом является скорость жесткого диска и контроллера ввода-вывода.
Я очень сомневаюсь, что это будет иметь значение.
Ваша основная проблема - это сотни тысяч крошечных файлов. Их чтение заставит диск перегружаться и будет длиться вечно, независимо от того, как вы это делаете, вы потратите 99,9% времени на ожидание механического движения внутри жесткого диска.
Есть два способа исправить это:
Это зависит от того, как вы читаете данные. Если вы читаете из FileInputStream очень неэффективным способом (например, вызывая read () побайтно), то использование BufferedInputStream может значительно улучшить ситуацию. Но если вы уже используете буфер разумного размера с FileInputStream, переключение на BufferedInputStream не имеет значения.
Поскольку вы говорите о большом количестве очень маленьких файлов, есть большая вероятность, что большая часть задержки связана с операциями с каталогами (открытие, закрытие), а не с фактическим чтением байтов из файлов.