检查数据库表中引用的文件的物理存在

时间:2011-09-20 10:43:07

标签: java clojure diff clojure-contrib

我们有一个相当大的表,其中包含文档信息以及指向文件系统上文件的文件路径。 几年后,我们注意到磁盘上的文件没有在DB表中引用,反之亦然。

由于目前我正在学习Clojure,我认为制作一个可以在db和文件系统之间找到差异的小实用程序会很好。当然,因为我是初学者,所以我被困了,因为有超过60万个文档,显然我需要更高性能和更少内存消耗的解决方案:)

我的第一个想法是生成包含所有文件的展平文件系统树列表,并将其与来自db的列表进行比较,如果文件不存在则放在单独的列表中“不存在”并且如果某些文件存在于HDD而不是DB,将其移动到某个转储目录。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

作为草图,这里是你如何根据你满意的大小来检查数据库中的文件系统:

(->> (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,而是对文件列表进行某种数据库检查。

答案 1 :(得分:0)

我会根据您对性能与内存的偏好建议三种选择之一:

  1. 内存密集型:使用调用File.listFiles的递归方法将所有文件放入列表中。然后将列表与您的数据库进行比较。

  2. IO密集型解决方案:针对数据库逐个递归检查每个文件。

  3. 中间解决方案:读取一个目录中的所有文件,将它们与数据库进行比较。递归任何子目录并重复。与选项1具有相同数量的IO调用,但在任何时候只在内存中保存一个分支+一个目录的文件路径。