我有成千上万的pdf文件,大多数是以编程方式访问的。它们是学术文档,其名称以<the last name of the author in letter><optional digit(s) to distinguish different authors of the same name><period><year><optional letter(s) to distinguish different documents of the same author-year>
)开头,如下所示:
Johns1.2000a.pdf
从编程相关程序的角度来看,如果所有这些文件都在一个目录中就更容易了。
但是,当我偶尔在GUI文件浏览器上手动打开这些文件时,该目录非常庞大,文件浏览器的响应变慢。因此,我将文件分成以文件名的首字母命名的子目录(即文件Johns....pdf
进入子目录J
等)。但
也有这种方法的问题。
AA
,AB
,...,
QQ
中很少有文件,但KA
中的文件很多,例如)。在这种情况下,
答案 0 :(得分:1)
警告:我只是想到了我的头脑。这仅针对您的问题#2。
假设您将每个文件名映射到其哈希码中,并将该文件存储在基于哈希码的目录结构中?例如,
str = "Johns1.2000a.pdf"
str.hash.abs.to_s.chars
#=> ["5", "2", "2", "1", "9", "8", "0", "3", "1",
# "6", "9", "8", "3", "0", "8", "1", "5", "2"]
因此该文件可能存储为
/5/2/2/Johns1.2000a.pdf
您可以使用以下规则:
最初创建目录/1
,/2
,...,/9
,并根据其哈希码的绝对值的第一个数字将文件添加到这些目录。
保存文件时,如果子目录d
已包含N
个文件(N
为参数),则创建子目录/0
,{{1} /1
的{},/2
,...,/9
,并根据其哈希码将d
中的每个文件移动到相应的子目录中。在上面的示例中,文件d
将从Johns1.2000a.pdf
移至/5/2/2/Johns1.2000a.pdf
。
检索文件,根据文件的哈希码深入到最后一个子目录。
您可以定期遍历树以查看是否有任何next-to-last-level-subdirectory /5/2/2/1/Johns1.2000a.pdf
仅包含空子目录,在这种情况下d
的子目录都可以删除。或者,每个目录可以包含一个文件,该文件包含其直接子目录中文件总数的计数,这些文件将在添加或删除文件时更新。当计数器变为零时,可以删除子目录。
有几点意见:
这显然要求用于计算哈希码的算法将来不会改变。如果有可能发生,可以使用自定义哈希码方法。
我假设哈希码的绝对值中的前几位几乎是随机分布的,但如果没有,哈希码的最后几位肯定是。