我需要維護大量的python pickleable對象。該列表太大而無法全部存儲在RAM中,因此需要一些數據庫\分頁機制。我需要該機制支持快速訪問列表中的近距離(附近)區域。在python中維護大型列表
該列表應該實現所有python-list功能,但大多數時候我將按順序工作:掃描列表中的某個範圍,並在掃描時決定是否要在掃描點中插入\彈出一些節點。
該列表可能非常大(2-3 GB),並且不應該一次全部包含在RAM中。 節點很小(100-200字節),但可以包含各種類型的數據。
對此的很好的解決方案,可以使用B樹,其中只有最後訪問桶在RAM中。
使用SQL表並不好,因爲我需要實現一個複雜的索引鍵機制。 我的數據不是一張表,它是一個簡單的python列表,具有在特定索引中添加元素以及從特定位置彈出元素的功能。
我試過ZODB和zc.blist,它們實現了基於BTree的列表,可以存儲在ZODB數據庫文件中,但我不知道如何配置它以便上述功能在合理的時間內運行。 我不需要所有的多線程\交易功能。除了我的單線程程序外,其他人都不會觸及數據庫文件。
任何人都可以解釋我如何配置ZODB \ zc.blist因此上述功能將跑得快,或者告訴我不同的大名單執行?
一些快速&骯髒的代碼,我想:
import time
import random
NODE_JUMP = 50000
NODE_ACCESS = 10000
print 'STARTING'
random_bytes = open('/dev/urandom', 'rb')
my_list = list()
nodes_no = 0
while True:
nodes_no += NODE_JUMP
start = time.time()
my_list.extend(random_bytes.read(100) for i in xrange(NODE_JUMP))
print 'extending to %s nodes took %.2f seconds' % (nodes_no, time.time() - start)
section_start = random.randint(0, nodes_no -NODE_ACCESS -1)
start = time.time()
for index in xrange(section_start, section_start + NODE_ACCESS):
# rotate the string
my_list[index] = my_list[index][1:] + my_list[index][0]
print 'access to %s nodes took %.2f seconds' % (NODE_ACCESS, time.time() - start,)
打印止帶:
extending to 5000000 nodes took 3.49 seconds access to 10000 nodes took 0.02 seconds extending to 5050000 nodes took 3.98 seconds access to 10000 nodes took 0.01 seconds extending to 5100000 nodes took 2.54 seconds access to 10000 nodes took 0.01 seconds extending to 5150000 nodes took 2.19 seconds access to 10000 nodes took 0.11 seconds extending to 5200000 nodes took 2.49 seconds access to 10000 nodes took 0.01 seconds extending to 5250000 nodes took 3.13 seconds access to 10000 nodes took 0.05 seconds Killed (not by me)
400MB大怎麼樣?你的電腦有多少內存? – 2010-03-24 19:43:12
假設它可以達到2GB。我不希望它浪費所有的內存資源。 – Oren
我第一次嘗試將4,000,000個100字節的對象放入字典中,產生了一個耗費900MB的python進程。所花費的時間是幾十秒,並且對字典的訪問時間基本上是即時的。 –