2010-10-25 71 views
0

我目前正在編寫一個python應用程序,該應用程序將採用文本文件的目錄並根據文本文件中指定的屬性將它們解析爲自定義python對象。作爲我的應用程序的一部分,我將當前加載的對象數據集與先前的數據集(相同格式)進行比較,並對其進行掃描以找出可能的重複,衝突,更新等。但是,由於一次可能有〜10,000個對象,我真的不知道如何解決這個問題。Python對象存儲內存/字典/數據庫/其他選項

我正在將以前的數據集存儲在數據庫中,因爲它正在被另一個Web應用程序使用。截至目前,我的python應用程序將'建議'的數據集加載到內存中(創建規則對象),然後將這些對象存儲在字典中(問題#1)。然後,當需要比較時,我使用SQL查詢和失敗插入的組合來確定新的/現有的和現有但更新的條目(問題#2)。

充其量是可惡而可怕的。我正在尋找一些關於重構應用程序和處理對象存儲/比較的建議。

回答

1

你可以僞造Git所做的事情,並將整個集合加載爲基本上單個文件並從那裏解析。最大的問題是字典沒有排序,所以你的比較不會總是1:1。元組列表將給你1:1的比較。如果很多改變了,這將是困難的。

這是您如何做到這一點的基本流程。

  • 開始與指數0
  • 兩元組列表比較每個元組的哈希hashlib.sha1(str(tuple1)) == hashlib.sha1(str(tuple2))
  • 如果他們是平等的,記錄匹配索引,並添加1到每個指標,並再次比較
  • 如果如果沒有匹配,你可以假設有一個插入/更新/刪除發生並在以後回來

您可以將匹配項目映射爲參考點,以便進一步調查不匹配的項目。這項技術可以應用於您深入研究的每個級別。你將最終得出一個與個人價值觀不同的地圖。

好的是,您創建的每個切片可以並行比較,因爲它們不會彼此對應......除非您將某個文件從一個文件移動到另一個文件。

然後,使用diff庫比較兩個數據集可能會更容易一些。不妨重新發明輪子;即使它可能是一個非常閃亮的車輪。

結帳http://docs.python.org/library/difflib.html