Если вы настроены на то, чтобы оставаться в памяти с одним процессом Python, вам придется отказаться от типа данных dict
— как вы заметили, он имеет отличные характеристики производительности во время выполнения, но использует кучу памяти, чтобы получить вас там.
На самом деле, я думаю, что комментарий @msw и ответ @Udi уместны - для масштабирования вам следует обратить внимание на какое-либо хранилище на диске или, по крайней мере, внепроцессное хранилище, возможно, РСУБД - это проще всего начать.
Однако, если вы уверены, что вам нужно оставаться в памяти и в процессе, я бы рекомендовал использовать отсортированный список для хранения вашего набора данных. Вы можете выполнять поиск за время O(log n), а вставки и удаления за постоянное время, и вы можете обернуть код для себя, чтобы использование выглядело очень похоже на defaultdict
. Что-то вроде этого может помочь (не отлажено за пределами тестов внизу):
import bisect
class mystore:
def __init__(self, constructor):
self.store = []
self.constructor = constructor
self.empty = constructor()
def __getitem__(self, key):
i, k = self.lookup(key)
if k == key:
return v
# key not present, create a new item for this key.
value = self.constructor()
self.store.insert(i, (key, value))
return value
def __setitem__(self, key, value):
i, k = self.lookup(key)
if k == key:
self.store[i] = (key, value)
else:
self.store.insert(i, (key, value))
def lookup(self, key):
i = bisect.bisect(self.store, (key, self.empty))
if 0 <= i < len(self.store):
return i, self.store[i][0]
return i, None
if __name__ == '__main__':
s = mystore(set)
s['a'] = set(['1'])
print(s.store)
s['b']
print(s.store)
s['a'] = set(['2'])
print(s.store)
person
lmjohns3
schedule
10.10.2014