0

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

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

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

有任何想法吗?

4

2 回答 2

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

于 2011-09-20T21:04:53.150 回答
0

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

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

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

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

于 2011-09-20T10:55:42.797 回答