2014-06-15 18 views
0

我有成千上万个主要以编程方式访问的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

注意:我只是在想我的头顶。这仅针对您的问题#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/2,...,的d/9d每个文件移动到相应的子目录,基于它的哈希码。在上面的示例中,文件Johns1.2000a.pdf将从/5/2/2/Johns1.2000a.pdf移至/5/2/2/1/Johns1.2000a.pdf

  • 基于文件的哈希码检索文件,直到最后一个子目录。

  • 你可以定期在树,看是否有下一个到最后一级子目录d只包含空的子目录,在这种情况下d的子目录可以全部删除。或者,每个目录可以包含一个文件,其中包含其直接子目录中文件总数的计数,当文件被添加或删除时这些文件将被更新。当计数器变为零时,可以删除子目录。

一对夫妇的意见:

  • 这显然需要,该算法计算哈希码不会改变未来。如果有可能发生,您可以使用自定义哈希代码方法。

  • 我假设散列码的绝对值的前几位几乎是随机分布的,但是如果不是,散列码的最后几位肯定会是。

+0

这大多解决了分布不均匀的问题(如果过程可以自动化,则会产生声响)。 (次要)问题是它不能直观地手动访问。但也许我期待太多。 – sawa

+0

在您实施解决方案后,我很乐意在将来看到该问题的更新。 –