2017-01-11 121 views
3

我編寫了一個Python腳本,用於加載用戶/藝術家/ playcount數據集並預測我可能喜歡哪些藝術家。但是,數據庫(我下載的.tsv文件)很大,因此需要花時間閱讀它並將所需的信息存儲在字典中。我怎樣才能優化這個?有沒有辦法保存加載的數據庫,所以每次我想做出預測時,我都不必再次加載它了?避免每次腳本運行時加載數據庫

非常感謝。

+1

使用實際的數據庫。它不會試圖一次性將所有內容都保存在內存中。 'sqlite'非常簡單。另一個選擇是讓守護進程始終運行,並裝載數據庫。你通過IPC(管道,插座等)與它進行通信。 –

+0

我發現這個解決方案很方便:http://stackoverflow.com/a/6687707/6027071 – Alejandro

回答

2

您可以使用shelve module存儲和加載您的字典。如果創建字典的處理時間相對於將其加載到內存中所需的時間較長(即,如果算法複雜或字典很小),這可能會帶來益處。

如果您的字典仍然很大,您可以使用的一個技巧是將文件指針偏移量存儲爲字典值。也就是說,如果希望字典值是關於歌曲的某些信息(例如),而不是將信息本身存儲在字典中,則將字節偏移量存儲在對應行開始的TSV文件中。然後,當您想要訪問該信息時,打開TSV文件,尋找偏移量,讀取一行,並解析它以構建代表該歌曲的對象。搜索速度很快,或者至少比閱讀整個文件要快得多。或者,您可以使用mmap module來存儲映射文件並將其有效地視爲一個字節數組,如果您知道需要多少字節(或者至少具有相當低的上限),這一點特別有用。

如果要保持與其他編程語言編寫的其他系統的兼容性,或者如果您只想要可讀的內容,則可以使用json module來代替將字典存儲爲JSON。如果你的字典不是太大,我會推薦這個。

您可以嘗試的另一個解決方案是將字典中的信息首先存儲在數據庫中。數據庫的組織方式使得訪問速度更快。 Python的標準庫包括您可以用來訪問SQLite數據庫的sqlite3 module。這應該沒問題。但是,如果您已經運行了數據庫服務器,或者您有特殊需求使得使用單獨的數據庫服務器更爲有利(例如多個進程同時訪問數據庫),則可以使用SQLAlchemy在任何SQL數據庫中存儲和加載數據。

爲了完整起見,我還提到​​,它可以用來存儲幾乎任何Python對象,但我不認爲你需要直接使用它。有更多簡化的方式來存儲和加載字典型數據。

相關問題