将海量文件分成子目录

时间:2014-06-15 02:41:37

标签: file architecture directory

我有成千上万的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等)。但

  • 我想知道这样做是否合理,

也有这种方法的问题。

  • 首先,文件名不是相对于首字母均匀分布的;一些字母有更多的文件以它开头,而另一些字母则更少。
  • 其次,如果文件集合增长,每个子目录都会变得太大,我将不得不进入另一个级别,如AAAB,...,
    • 是任意的和临时的(每当我觉得子目录变得太大时我都必须手动添加一个级别),并且
    • 不平衡的分布会变得更糟(即,目录QQ中很少有文件,但KA中的文件很多,例如)。

在这种情况下,

  1. 创建子目录是否有意义?我只是偶尔手动访问文件,所以我可以忍受文件浏览器上的慢响应。从其他角度来看,有没有这样做的专业人士?
  2. 如果创建目标确实有意义,那么有一种方法没有上述问题吗?

1 个答案:

答案 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的子目录都可以删​​除。或者,每个目录可以包含一个文件,该文件包含其直接子目录中文件总数的计数,这些文件将在添加或删除文件时更新。当计数器变为零时,可以删除子目录。

有几点意见:

  • 这显然要求用于计算哈希码的算法将来不会改变。如果有可能发生,可以使用自定义哈希码方法。

  • 我假设哈希码的绝对值中的前几位几乎是随机分布的,但如果没有,哈希码的最后几位肯定是。