Проверьте, существуют ли файлы без слишком большого количества мусора - PullRequest
2 голосов
/ 19 января 2012

Я пытаюсь сделать следующее: у меня есть база данных, заполненная именами файлов, расположенная в каталоге.Этот каталог постоянно меняется (загруженные файлы добавляются и удаляются).Мое приложение должно сканировать этот каталог в первый раз и добавить файлы в базу данных.Во второй раз, когда приложение будет запущено, оно должно проверить, все ли имена файлов в базе данных все еще доступны в каталоге.

Для проверки я использую следующий псевдокод:

get the filename from the database
check if exists (file f = new File(filename))
                 if (f.exists()){
                     mark as existing;
                  } else {
                    mark is as deleted
                  }

if it does, then mark it as existing, else mark it as removed (later will clean the database up)

Вопрос: как я могу проверить все файлы в базе данных, если они существуют, не производя много мусора?Количество файлов может превышать 1000. Выполнение цикла с «новым файлом (...)» более 1000 раз вызовет слишком много мусора.

Любая помощь приветствуется.

Ответы [ 3 ]

4 голосов
/ 19 января 2012

Объект File() действительно крошечный.Он содержит только строку пути и ссылку на объект FileSystem.Это просто похоже на трату ресурсов, но это не так.

Думайте об объекте File как о строке пути с несколькими вспомогательными методами для работы с путями к файлам.Он не имеет ничего общего с файловым дескриптором или другими тяжелыми ресурсами.

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

4 голосов
/ 19 января 2012

Файлов может быть больше 1000. Запуск цикла с «новым файлом (...)» более 1000 раз вызовет слишком много мусора.

В самом деле? Вы проверяли это? Я не вижу, чтобы это было серьезной проблемой в современных системах. (Что вас больше всего беспокоит? Сборка мусора JVM?)

В противном случае получите текущий каталог, затем вызовите .list() или .listFiles(), загрузите в Set для производительности (HashSet, вероятно, будет хорошо), а затем просто выполните запрос к множеству. (Вы по-прежнему будете создавать строки и записи в наборе, которые могут быть похожи на проблемы GC.) Потенциальная проблема здесь заключается в том, что теперь вы загружаете потенциально «большое» количество элементов в память внутри JVM, а не проверяете по требованию, когда вы читаете каждую строку из базы данных.

Я бы придерживался кода, который вы обрисовали. +1 за ответ Михала - пожалуйста, просмотрите дополнительную информацию о том, почему это не должно беспокоить.

0 голосов
/ 19 января 2012

Сделайте иначе - вы добавляете набор строк в таблицу базы данных. Затем вы сканируете каталог, в котором находятся файлы, и просто получаете список имен файлов и сравниваете этот список с запросом типа «выбрать имена из filesTable».

...