我们有一个相当大的表,其中包含文档信息以及指向文件系统上文件的文件路径。 几年后,我们注意到磁盘上的文件没有在DB表中引用,反之亦然。
由于目前我正在学习Clojure,我认为制作一个可以在db和文件系统之间找到差异的小实用程序会很好。当然,因为我是初学者,所以我被困了,因为有超过60万个文档,显然我需要更高性能和更少内存消耗的解决方案:)
我的第一个想法是生成包含所有文件的展平文件系统树列表,并将其与来自db的列表进行比较,如果文件不存在则放在单独的列表中“不存在”并且如果某些文件存在于HDD而不是DB,将其移动到某个转储目录。
有什么想法吗?
答案 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)
我会根据您对性能与内存的偏好建议三种选择之一:
内存密集型:使用调用File.listFiles的递归方法将所有文件放入列表中。然后将列表与您的数据库进行比较。
IO密集型解决方案:针对数据库逐个递归检查每个文件。
中间解决方案:读取一个目录中的所有文件,将它们与数据库进行比较。递归任何子目录并重复。与选项1具有相同数量的IO调用,但在任何时候只在内存中保存一个分支+一个目录的文件路径。