Как насчет буферизации FileInputStream? - PullRequest
8 голосов
/ 21 мая 2010

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

Как вы думаете, включение FIS в java.io.BufferedInputStream имело бы существенное значение?

Ответы [ 3 ]

9 голосов
/ 21 мая 2010

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

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

3 голосов
/ 21 мая 2010

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

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

3 голосов
/ 21 мая 2010

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

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

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

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