2010-09-22 38 views
2

我正在構建具有將數據存儲在mysql表(跨多個表)中的對象的應用程序。當我需要處理對象(檢索對象屬性/更改屬性)時,我正在使用mysqldb查詢sql數據庫(select/update)。但是,由於應用程序的計算密集程度很高,所以執行時間正在令我失望。爲數據庫訪問優化Python代碼

想了解是否有方法將所有數據加載到python中,對這些對象進行計算/修改,然後對mysql數據庫進行完整數據更新?將數據最初加載到這些對象的列表中是否會提高性能?另外,由於數據庫大小接近25 MB,會導致任何內存問題。

在此先感謝。

回答

5

25Mb很小。微觀的。 SQL很慢。冰川。

不要在SQL上浪費時間,除非您有事務(帶鎖定和多個用戶)。

如果您正在進行「分析」,尤其是計算密集型分析,請將所有數據加載到內存中。

如果數據不適合內存,那麼請執行此操作。

  1. 將數據查詢到平面文件中。這可以很快。如果不使用Python,速度最快,但使用數據庫本地工具將數據提取到CSV或更小。

  2. 讀取平面文件並進行計算,編寫平面文件。這真的很快。

  3. 從平面文件進行批量更新。同樣,如果您使用數據庫原生工具集進行插入或更新,這是最快的。


如果您並不需要擺在首位SQL,考慮將數據作爲您最初收到它,你會用它做什麼。

  1. 讀取原始文件一次,解析它,創建您的Python對象,並醃製整個列表或字典。這意味着每個後續程序都可以簡單地加載酸洗文件並開始分析。然而。您無法輕鬆更新醃製文件。你必須創建一個新的。這不是一件壞事。它給你完整的加工歷史。

  2. 讀取原始文件一次,解析它,使用擱置創建您的Python對象。這意味着你可以更新文件 。

  3. 讀取原始文件一次,解析它,創建您的Python對象並將整個列表或字典保存爲JSON或YAML文件。這意味着每個後續程序都可以簡單地加載JSON(或YAML)文件並開始分析。然而。您無法輕鬆更新文件。你必須創建一個新的。這不是一件壞事。它給你完整的加工歷史。

    這可能會比酸洗略慢。這將需要你編寫一些助手,以便JSON對象被正確轉儲和加載。但是,您可以閱讀JSON(和YAML),這爲您使用該文件提供了一些優勢。

+0

嗨S.洛特,謝謝。我沒有事務,因此sql不是強制性的。儘管如此,我確實需要持久存儲數據,因爲存在多個類的對象及其關係,這些對象正在不斷添加和使用。在sql中,我將數據結構化爲多個表,用於保存對象相關數據以及對象間關係。如果我將數據加載到內存中,則列表中的對象將包含它們之間的關係,對嗎?此外,還有任何有關使用數據庫本機工具的建議。謝謝您的幫助。 – Vivek 2010-09-22 15:12:52

+0

擱置。 http://docs.python.org/library/shelve.html醬菜。 http://docs.python.org/library/pickle.html的確,本章中的任何內容。 http://docs.python.org/library/persistence.html – 2010-09-22 15:45:17

+0

@ S.Lott你能評論一下爲什麼sql很慢嗎? – Lazik 2013-12-12 15:17:36

0

請檢查sqlalchemy,Python的對象關係映射器。

sqlalchemy允許您將數據庫表映射到Python對象。當你這樣做時,所有的操作都可以在Python對象上完成(一旦數據被加載),並且當你完成處理時,你可以更新數據庫。

假設你有一個基本的現成計算機,25 MB是絕對沒有什麼大不了的,你可以將整個數據庫緩存到內存中。