나는 pickleable python 개체의 큰 목록을 유지 관리해야합니다. 목록이 너무 커서 RAM에 모두 저장되지 않으므로 일부 데이터베이스 \ 페이지 매커니즘이 필요합니다. 나는 그 메커니즘이 목록에있는 가까운 (가까운) 지역에 대한 빠른 액세스를 지원할 필요가있다.큰 목록을 파이썬에서 유지하기
리스트는 모든 파이썬 목록 기능을 구현해야하지만 대부분 순차적으로 작업 할 것입니다. 목록의 일부 범위를 스캔하고 스캐닝 중에 스캔 지점에 일부 노드를 삽입 할 것인지 결정하십시오.
목록이 매우 클 수 (2 - 3GB) 있으며 한 번에 모두 RAM에 포함되어서는 안됩니다. 노드는 작지만 (100-200 바이트) 다양한 유형의 데이터를 포함 할 수 있습니다.
좋은 해결책은 마지막으로 액세스 한 버킷 만 RAM에로드되는 BTree를 사용하는 것입니다.
복잡한 인덱스 키 메커니즘을 구현해야하므로 SQL 테이블을 사용하는 것은 좋지 않습니다. 내 데이터는 특정 인덱스에 요소를 추가하고 특정 위치에서 요소를 팝하는 기능이있는 테이블, 간단한 파이썬 목록이 아닙니다.
나는 ZODB 데이터베이스 파일에 저장할 수있는 BTree 기반 목록을 구현하는 ZODB과 zc.blist을 시도했지만 위의 기능이 적절한 시간에 실행되도록 구성하는 방법을 알지 못합니다. 모든 멀티 스레딩 \ 트랜잭션 기능이 필요하지 않습니다. 아무도 내 단일 스레드 프로그램을 제외하고 데이터베이스 파일을 건드릴 수 없습니다.
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는 어떻게 커지나요? 컴퓨터의 RAM 용량은 얼마입니까? –
2GB에 도달 할 수 있습니다. 나는 모든 메모리 자원을 낭비하지 않기를 바란다. – Oren
사전에 100 만 바이트의 객체 4,000,000 개를 넣으려고 시도한 첫 번째 시도는 900MB를 소비하는 파이썬 프로세스를 생성했습니다. 소요 시간은 수십 초 였고 사전에 대한 액세스 시간은 기본적으로 순간적입니다. –