2010-10-24 22 views
0

我正在處理一個基本上監視設置的遠程目錄(FTP,聯網路徑和另一個)的項目,如果該文件被認爲是新的並且符合我們下載並處理它的標準。但是我堅持最好的方式是跟蹤我們已經下載的文件。我不想下載任何重複的文件,所以我需要跟蹤已下載的內容。python的數據持久性當很多查找但很少寫入?

Orignally我是把它作爲一個樹:

server->directory->file_name 

當服務關閉它,它寫入一個文件,當它啓動時重新讀取回來。但是,如果有大約20,000個左右的文件開始減速很多,

有沒有更好的方法來做到這一點?

編輯

的查找時間開始放緩了很多,我基本實現是一個字典的字典。在磁盤上存儲的東西很好,或多或少只是查找時間。我知道我可以優化樹並對其進行分區。然而,對於這樣一個小項目來說,這似乎過分了,我希望python會有類似的東西。

+1

如何使用'dict'的'dict'並使用'pickle'將數據序列化/反序列化到磁盤?你有沒有試過這個選項? – 2010-10-24 18:31:54

+0

這就是我所做的事情,但是字典的字典在某個點後開始減慢。當存儲大量文件時。 – UberJumper 2010-10-24 18:32:30

+1

如何使用像sqlite這樣的嵌入式SQL數據庫? Python有它的庫。 – 2010-10-24 18:39:20

回答

1

我會創建一組元組,然後將它醃到一個文件。元組將是(server, directory, file_name),或者甚至只是(server, full_file_name_including_directory)。不需要多級數據結構。元組將哈希到集合中,並給你一個O(1)查找。

你提到「東西開始減慢很多」,但你不會說它是在讀寫時間還是在減速的查找時間。如果你的查找時間正在減慢,你可能會尋呼。你的數據結構是否接近你物理內存的很大一部分?

取回內存的一種方法是intern()服務器名稱。這樣,每個服務器名稱將僅存儲在內存中一次。

一個有趣的選擇是使用布隆過濾器。這會讓你使用少得多的內存,但偶爾會下載一個你不需要的文件。這可能是一個合理的權衡,取決於你不想兩次下載文件的原因。

+0

在查找期間它正在放慢對不起,我糾正了這個問題。 – UberJumper 2010-10-24 18:34:40

+0

在每個元組中都有'server'不會給你dict-dict的能力來快速瀏覽所有服務器和它們各自的文件。想象一下,您想要登錄一次到服務器並操縱其所有文件... – eumiro 2010-10-24 18:35:52

+0

@eumiro,我不會想象任何新的要求。 OP表示他需要追蹤重複。 – 2010-10-24 18:37:53