Как FileInputStream находит файл?

1

Я разрабатываю программу, которая должна читать файл из папки, содержащей примерно 10 ^ 8 файлов.

Как FileInputStream находит нужный файл из предоставленного имени файла? Работает ли он аналогично хэш-карте с временем поиска O (1) или линейно перемещает файлы в данной папке, пока не найдет совпадение?

Я предполагаю, что это может иметь больше общего с тем, как работает хранилище файлов Windows, чем с FileInputStream, но я честно не уверен.

  • 0
    Рассмотрите использование SimpleFileVisitor для этого. ссылка
  • 0
    Насколько большие файлы? Имейте в виду, что в NTFS минимальная единица выделения составляет 4096 байт, поэтому при 10 ^ 8 файлах средняя загрузка дискового пространства составит около 200 ГБ.
Теги:
file-io

2 ответа

4

Имя файла передается ОС, и оно считывает каталог, ищущий соответствующее имя. Он может оптимизировать поиск, но Java не вмешивается.

Вы можете рассмотреть возможность разбивать файлы на несколько каталогов и в идеале использовать меньше файлов. Открытие и закрытие большого количества небольших файлов тратит большую часть времени на открытие и закрытие дескриптора файла. Нахождение и чтение обычно намного меньше.

  • 0
    Дополнительная информация: Я эффективно пытаюсь использовать каталог в качестве SuperHashMap с именами файлов в качестве ключей и сериализованными файлами в качестве объектов. Данная проблема требует очень небольшого числа операций чтения / записи в этот SuperHashMap, поэтому проблема открытия и закрытия многих файлов отсутствует, но надежда состоит в том, что, перенеся ответственность за управление данными на ОС, я могу предотвратить программе от необходимости загружать то, что фактически было бы объектом 10 ГБ, когда при любом отдельном запуске программы нам нужно было бы получить доступ только к 20 файлам. Учитывая эту ситуацию ... мнение?
  • 0
    @gravityplanx, хотя и не так эффективно, как хотелось бы, похоже, работает. Наличие большого количества файлов, вероятно, будет самым простым. Я хотел бы рассмотреть вопрос о создании каталога для каждого из первых 3-4 символов. Это может улучшить производительность вашей программы и любых инструментов, которые вы используете в этом каталоге.
3

Он просит операционную систему найти файл. Как это делает операционная система? Это зависит от ОС и от файловой системы. По крайней мере, в некоторых случаях ответ: "Да, это работает как HashMap". С другой стороны, я знаю, по крайней мере, некоторые комбинации ОС/файловой системы, которые серьезно увязли, когда у вас более нескольких тысяч файлов в одном каталоге.

  • 0
    Любая идея, где я могу найти поиск эффективности по операционной системе, чтобы увидеть, где это безопасно или где я столкнулся бы с проблемой?
  • 0
    Не могли бы вы просто проверить это, @gravityplanx. Просто перейдите в другой каталог и type <path-to-some-file> . Если это быстро, то будет и Java.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню