Проверьте физическое существование файлов, указанных в таблице БД - PullRequest
0 голосов
/ 20 сентября 2011

У нас есть одна довольно большая таблица, содержащая информацию о документах вместе с путями к файлам, указывающими на файлы в файловой системе. Через пару лет мы заметили, что у нас есть файлы на диске, на которые нет ссылок в таблице БД, и наоборот.

Так как в настоящее время я изучаю Clojure, я подумал, что было бы неплохо создать небольшую утилиту, которая может найти разницу между БД и файловой системой. Естественно, поскольку я начинающий, я застрял, потому что есть более 600 000 документов, и, очевидно, мне нужно более производительное и менее потребляющее память решение:)

Моя первая идея состояла в том, чтобы сгладить список деревьев файловой системы со всеми файлами и сравнить его со списком из базы данных, если файл не существует, поместить в отдельный список «несуществующий» и если какой-либо файл существует на жестком диске, а не в DB, переместите его в какую-нибудь директорию дампа.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

В качестве эскиза вы можете сравнить файловую систему с базой данных кусками любого размера, которым вы довольны:

(->> (file-seq (java.io.File. "/"))
     (remove (memfn isDirectory))
     (partition 20)
     (map (fn [files] (printf "Checking %d files against db...\n" (count files))))
     (take 2))

(Checking 20 files against db...
Checking 20 files against db...
nil nil)

Вместо использования printf выполните какую-либо проверку базы данных по списку файлов.

0 голосов
/ 20 сентября 2011

Я бы предложил один из трех вариантов, в зависимости от ваших предпочтений по производительности и памяти:

  1. Интенсивное использование памяти: используйте рекурсивный метод, вызывающий File.listFiles, чтобы поместить все файлы всписок.Затем сравните список с вашей БД.

  2. Интенсивное решение ввода-вывода: рекурсивно проверяйте каждый файл по одному с БД.

  3. Промежуточное решение: прочитать все файлы в одном каталоге, сравнить их с БД.Рекурсируй на любых подкаталогах и повторяй.Имеет то же количество вызовов ввода-вывода, что и в варианте 1, но одновременно содержит только одну ветку + один каталог путей файлов в памяти.

...