pátek 21. května 2010

Python a slovník

Nedařilo se mi do slovníku (dictionary) vložit víc než několik desítek milionů položek. Přitom paměti bylo víc než dost. Proto jsem napsal následující skript na zjištěná maximálního počtu položek, které lze do slovníku uložit.

i = 0
d = {}
try:
while True:
d[i] = i
i = i + 1
except MemoryError:
print i

Výsledný počet je 44739242. V hexadecimální soustavě je to 2AAAAAA, což vypadá podezřele. Upozornění: Skript může způsobit pád některých programů.

Řešení problému:

class Dict2:
def __init__(self):
self.dicts = [{}]
def value(self, k):
for dict in self.dicts:
if k in dict:
return dict[k]
def isIn(self):
for dict in self.dicts:
if k in dict:
return True
return False
def insert(self, k, d):
for dict in self.dicts:
if k in dict:
dict[k] = d
return
try:
self.dicts[0][k] = d
except MemoryError:
self.dicts.insert(0, {})
self.dicts[0][k] = d

i = 0
d = Dict2()
try:
while True:
d.insert(i, i)
i = i + 1
except MemoryError:
print i

2 komentáře:

Tomas řekl(a)...

Pro vysvětlení viz třeba http://old.nabble.com/Python-dictionary-size-entry-limit--td22134233.html
jak jsem pochopil je to správou paměti ve Windows, taky to závisí na volné paměti a operačním systému.

Mě to spadlo u 22369621 :)

Giovanni řekl(a)...

Něčím tokovým to určitě bude. Ale nejen ve Windows. Úplně stejný problém (dokonce to spadlo na stejném čísle) jsem měl v Linuxu. Vytvořil jsem proto třídu, která používá víc slovníků. Teď už lze využít celou paměť. Vyzkoušel jsem to - funguje to.