2010-05-31 44 views
3

Python字典碰見我需要一個大(=巨大)Python字典,這竟然是相當存儲器消耗的情況。然而,由於所有的值都是單一類型(長) - 以及鍵,我想我可以使用python(或numpy,並不重要)數組的值;並用一個實際使用這些數組作爲鍵和值存儲的對象包裝所需的接口(in:x; out:d [x])。具有恆定值型

我可以使用一個索引轉換對象(輸入 - >索引,1..n的,其中n是不同值的計數器),並返回數組[索引]。我可以詳細說明如何實現這種具有合理內存要求的索引方法的一些技巧,它的工作原理甚至相當不錯。 但是,我想知道是否有這樣一個數據結構對象已經存在(在Python中,或從C/++包裝到Python中),在任何包中(我檢查了集合和一些Google搜索)。

任何評論將受到歡迎,感謝。

+0

您應該考慮使用元組而不是列表,如果你還沒有這樣做的話; Python沒有簡單的「數組」,但元組肯定更具有內存效率,因爲它不會保留插入空間。然而,由於哈希表的存在,字典仍然會咀嚼內存,因此您可能需要考慮使用已排序的數據結構並使用二分查找來查找所需的鍵,這些鍵映射到Tuple的索引。 – 2010-05-31 08:58:51

+0

你爲什麼想着簡單的Python實現?可能值得尋找已經實施索引的任何現成的鍵值存儲解決方案,例如東京內閣? – Vestel 2010-05-31 09:30:10

回答

2

這種任務的是一個典型的數據庫類型的訪問(在特定類型的列大容量的數據)。您將創建一個帶索引鍵的簡單表格,以便快速訪問。我沒有這方面的經驗,但你可能想看看標準的sqlite3模塊。

如果你的鑰匙不隨時間而改變,你可以或者把所有的數據在兩個Python內存優化陣列(標準array模塊);一個數組包含已排序的鍵,另一個數組包含相應的值。然後您可以通過優化的bisect.bisect函數找到關鍵指標。

+0

+1用於建議一個數據庫和另一個Python解決方案。 – 2010-05-31 10:16:07

0

你可以嘗試使用std :: map。 Boost.Python爲std :: map開箱即用提供了一個Python包裝。