2011-03-13 81 views
0

我有2個文件夾。第一個(稱爲A)包含以下形式命名的相同圖像:subject_incrementalNumber.jpg(其中incrementalNumber從0到X)。加快創建路徑名稱

然後,我處理包含在文件夾A中的每個圖像,並從中提取一些小塊,然後將每個小塊保存在文件夾B中,其名稱爲subject(與文件夾A中包含的原始圖像相同)_incrementalNumber(與文件夾相同A)_anotherIncrementalNumber(區分一件和另一件)。

最後,我刪除文件夾A.

A 
    subjectA_0.jpg 
    subjectA_1.jpg 
    subjectA_2.jpg 
    ... 
    subjectB_0.jpg 

B 
    subjectA_0_0.jpg 
    subjectA_0_1.jpg 

    subjectA_1_0.jpg 

    subjectA_2_0.jpg 
    ... 

每次我下載一個主題的新形象處理後的圖像,並將其保存在文件夾中,我不得不計算出新的路徑名該圖像(I必須找到可用於特定主題的min incrementalNumber)。問題是,當我處理圖像時,我將它從文件夾A中刪除,而我只將這些文件存儲在文件夾B中,因此我必須在兩個文件夾中找到可用的最小編號。

現在我用下面的函數來創建路徑

output_name = chooseName(subject, folderA, folderB) 

# Create incremental file 
# If the name already exist, try with incremental number (0, 1, etc.) 
def chooseName(owner, dest_files, faces_files): 
    # found the min number available in both folders 
    v1 = seekVersion_downloaded(owner, dest_files) 
    v2 = seekVersion_faces(owner, faces_files) 

    # select the max from those 2 
    version = max(v1, v2) 

    # create name 
    base = dest_files + os.sep + owner + "_" 
    fname = base + str(version) + ".jpg" 
    return fname 


# Seek the min number available in folderA 
def seekVersion_folderA(owner, dest_files): 
    def f(x): 
     if fnmatch.fnmatch(x, owner + '_*.jpg'): return x 

    res = filter(f, dest_files) 

    def g(x): return int(x[x.find("_")+1:-len(".jpg")]) 
    numbers = map(g, res) 

    if len(numbers) == 0: return 0 
    else: return int(max(numbers))+1 


# Seek the min number available in folderB 
def seekVersion_folderB(owner, faces_files): 
    def f(x): 
     if fnmatch.fnmatch(x, owner + '_*_*.jpg'): return x 

    res = filter(f, faces_files) 

    def g(x): return int(x[x.find("_")+1:x.rfind("_")]) 
    numbers = map(g, res) 

    if len(numbers) == 0: return 0 
    else: return int(max(numbers))+1 

它的工作原理,但這個過程需要大約10秒爲每個圖像,因爲我有很多的圖片,這是效率太低。 有任何解決方法使其更快?

回答

0

我找到了另一種解決辦法:使用該文件的哈希值作爲唯一的文件名

1

如上所述,這確實是一個沒有魔法捷徑的難題。爲了找到可用的最小數量,您需要使用試驗和錯誤,就像您正在做的一樣。雖然實施可以加快,但算法存在根本的侷限性。

我想我會放鬆這個問題的一些限制。我會準備選擇不是最小可用的數字。我會在包含創建文件時使用的最後一個數字的目錄中存儲隱藏文件。每當您創建另一個文件時,請從該文件中讀取該數字,將其增加1,然後查看該名稱是否可用。如果是這樣,你很好走,如果沒有,從那裏開始數。請記住在確定名稱時更新文件。

如果沒有人正在讀這些名字,那麼使用隨機生成的名字可能會更好。

+1

,如果你使用的是隨機生成一個確保它不會與現有的第一碰撞。 – 2011-03-13 21:56:49

+0

@archimedes確實! – 2011-03-13 21:59:13

+0

@David:你的想法很好,但問題是主題的名稱必須是路徑名(這不是我的選擇)。所以我可以創建一個隱藏文件,其中每行包含主題名稱和最小可用編號。同樣在這種情況下,我有一個開銷,但這可能是當前的小事。 – 2011-03-13 22:31:49