2014-06-15 16 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

在您實施解決方案後,我很樂意在將來看到該問題的更新。 –