2014-07-22 106 views
1

我正在研究一個項目,在該項目中,我將大量數據抓取並重新組織到結果文本文件中。之前我使用字典來存儲臨時數據,但隨着數據量的增加,由於內存使用和字典變得無用,進程變慢。Python文本文件而不是字典

由於在我的情況下進程速度並不那麼重要,我試圖將字典替換爲文件,但我不確定如何輕鬆地將文件指針移動到適當的位置並讀取所需的數據。在字典中,我可以很容易地引用任何數據。我想達到相同,但在文件中。

我想使用mmap並編寫自己的函數來移動文件指針,我想要的地方。 Python是否具有用於此類操作的內置或第三方模塊?

歡迎任何其他理論方法。

回答

8

我想你現在正在嘗試重新創建一個鍵值數據庫。

也許最簡單的事情是檢查sqlite3模塊是否會爲您提供您所需要的。使用現成的數據庫比滾動自己的數據庫更容易!

當然,sqlite3不是鍵值DB(表面上),所以如果你需要的東西更簡單,看看LMDB及其Python綁定:http://lmdb.readthedocs.org/en/release/

這是因爲重量輕,速度快隨着它的到來。這可能是實現你想要的最快方法。


應該指出的是,沒有最佳的鍵值數據庫。有幾個方面需要考慮。至少:

  • 你讀了很多或寫了很多嗎?
  • 什麼是關鍵和值的大小?
  • 你需要交易/防撞嗎?
  • 你有重複的鍵(一個鍵,幾個值)?
  • 你想排序的密鑰?
  • 您是否想按照插入的順序讀取數據?
  • 什麼是您的數據庫大小(MB,GB,TB,PB)?
  • 您是否受限於IO或CPU?

例如,我上面提到的LMDB在讀取密集型任務中非常好,而不是在寫密集型任務中。它提供事務處理,按鍵排列順序並防止崩潰(受底層文件系統限制)。但是,如果您需要經常編寫數據庫,LMDB可能不是最佳選擇。

另一方面,SQLite並不是完成這項任務的理想選擇 - 理論上是speking。實際上,它被嵌入到標準的Python發行版中,因此易於使用。它可以提供足夠的性能,因此可能是最好的選擇。

那裏有許多高質量的數據庫。通過不提及它們,我不會試圖給出這樣的印象:在這個答案中提到的數據庫是唯一不錯的選擇。大多數數據庫管理員都有一個非常好的理由。雖然有些已經過時,但大多數在應用領域都有自己的甜點。

該領域不斷變化。有兩個全新的數據庫可用,舊的數據庫系統被更新。閱讀舊基準時應該牢記這一點。此外,所使用的硬件類型也有其影響;具有SSD磁盤的計算機,雲計算實例和具有HDD的傳統計算機在性能方面的表現完全不同。

+0

感謝您的及時迴應!我會嘗試兩個。 – g0m3z

+0

根據DrV的想法,我搜索了'python的鍵值數據庫',結果發現在這個主題中還有另一個發展良好的線程:[link](http://stackoverflow.com/questions/1690605/reliable -and-efficient-key-value-database-for-linux) – g0m3z

+0

@ g0m3z:在這個線程中有很多很好的討論。但是,到那時,所有現代系統都不存在了。另外,我認爲你不應該開始評估分佈式或其他非常複雜的系統,因爲你的任務很簡單。從單個文件開始。就我個人而言,我會嘗試SQLite,如果它不是太慢,就使用它,並忘記理論上的考慮。 – DrV