какой наилучший оптимизированный способ в Java получить последние (по убыванию последнего изменения) n файлов — без загрузки всех файлов большого каталога

#java #file #java-8 #file-io #java-7

#java #файл #java-8 #file-io #java-7

Вопрос:

Цель — получить последние 100 файлов. В настоящее время это делается путем сканирования всех файлов — подготовки списка файлов — и затем применения сортировки ограничение.

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

В настоящее время следующие три подхода не дают удовлетворительной производительности, когда файлы находятся в диапазоне нескольких тысяч.

  • Files.listFiles — Java 1.2
  • DirectoryStream — Java 1.7
  • Файлы.Прогулка — Java 1.8

Комментарии:

1. Вы хотите получить n файлов с последней обновленной меткой времени?

2. Возможно, служба просмотра каталогов Java. Хотя большие каталоги по своей сути медленные. Процесс ProcessBuilder с фильтром Linux для последних файлов?

3. Если у вас есть какой-либо контроль над созданием файлов, то может помочь разделение их на подкаталоги по времени создания.

4. @RaviSamani конечно, сначала попробуйте WatchService. Для каждой загрузки сначала требуется полное сканирование каталога (Files.list), но затем оно должно быть быстрее.

5. Перебирайте все файлы и сохраняйте их в a PriorityQueue ; всякий раз, когда размер достигает 101, удаляйте самые старые.

Ответ №1:

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

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

Я бы подумал об использовании Files.find(). Это видно из его документации для выполнения минимальной требуемой работы.

Вам не нужно сохранять все файлы. Отслеживайте самые старые из последних 100 просмотренных. Если «следующий» файл старше этого, вам не нужно его сохранять. В противном случае вам нужно выяснить, какой из 100 отбросить. Это компенсирует накладные расходы на хранение всего списка для принятия решения о том, что отбросить. Это может сработать в вашу пользу, если количество файлов намного больше 100.

В некоторой степени накладные расходы зависят от файловой системы. Если время последнего изменения сохраняется в записи каталога, тогда нет необходимости просматривать индекс, чтобы получить его. Конечно, это не под вашим контролем.

Комментарии:

1. итак, в нашем случае мы видели файлы, кратные 10 кб, что означает, что в какой-то папке — 20 000 файлов, даже 70 000! БОЛЬШИЕ каталоги! Итак, чтобы узнать последние 100 — единственный способ — перебрать все, а затем выяснить — правильно ? .

2. ДА. Дизайн, который помещает столько файлов в один каталог, неисправен, поэтому вам нужно запрограммировать этот дефектный дизайн. Как выше переместить 69 900 файлов, которые не являются самыми старыми, в отдельный каталог? Это одноразовый удар, который принесет пользу в будущем.

3. @user14387228 к сожалению, из комментариев OP выше звучит так, как будто любой файл может быть изменен и стать новейшим файлом.