Существуют ли в питоне каке либо средства или библиотеки позволяющие сохранять структуры (подобные c++ структурам) более эффективно (по памяти) нежели представление их через словари? (dict)
Ситуация в общем такая у меня есть список (list) структур содержащих в свою очередь несколько вложенных структур. При 100.000 элементах в списке python потребляет 400MB памяти. Мажно ли как нибудь это потребление уменьшить?
Здравствуйте, meandr, Вы писали:
M>Hello, All!
M>Существуют ли в питоне каке либо средства или библиотеки позволяющие сохранять структуры (подобные c++ структурам) более эффективно (по памяти) нежели представление их через словари? (dict)
M>Ситуация в общем такая у меня есть список (list) структур содержащих в свою очередь несколько вложенных структур. При 100.000 элементах в списке python потребляет 400MB памяти. Мажно ли как нибудь это потребление уменьшить?
Есть стандартный модуль struct — он позволяет создавать структуры из элементов любого типа. Есть еще модуль array, который позволяет создавать массивы только определенного типа.
Вот решил сам ознакомиться с данным вопросом, написал простой тест. Размещаем 100к структур из 20 случайных целых чисел в tuple, struct, array, смотрим на разницу. Тестировал на Python 2.5.
test100k.py:
from time import sleep
from struct import pack
from random import randint
from array import array
def testTuple():
return [tuple((randint(0,100000) for j in xrange(0,20))) for i in xrange(0, 100000)]
format = "i"*20
def testStruct():
return [pack(format, *[randint(0,100000) for j in xrange(0,20)]) for i in xrange(0, 100000)]
def testArray():
return [array("i", [randint(0,100000) for j in xrange(0,20)]) for i in xrange(0, 100000)]
sleep(3)
l = testTuple() # 41 Mb
#l = testStruct() # 14 Mb
#l = testArray() # 16 Mb
sleep(3)
Результат:
testTuple: 41 Mb
testStruct: 14 Mb
testArray: 16 Mb
Массив указателей на 80-байтные структуры на C++ занял бы (80 + 4)*100000 = 8400000 = 8.2Mb
Здравствуйте, meandr, Вы писали:
M>Re: Эффективное хранение структур в Python
M>Я наверное плохо выразился я хучу эфективно хранить нечто вроде такого:
Я для такого рода просто встроил persistence в язык и VM (tiscript).
Т.е. корень таких данных можно присвоить в Storage.root и они автомагически будут вытесняться из heap в storage прозрачно для тебя (в цикле GC сборки). Т.е. в heap будут реально только
фрагменты полного дерева. Плюс еще можно Index использовать за для эффективного поиска по ключам.
Я все это к тому что сильно твоя лохматая структура не упакуется.
Т.е. я думаю что в Python тебе имеет смысл смотреть в сторону DB, а в частности OODB какой.
Здравствуйте, meandr, Вы писали:
M>Re: Эффективное хранение структур в Python
M>Я наверное плохо выразился я хучу эфективно хранить нечто вроде такого:
M>
Здравствуйте, _jw, Вы писали:
_jw>Здравствуйте, meandr, Вы писали:
M>>Re: Эффективное хранение структур в Python
M>>Я наверное плохо выразился я хучу эфективно хранить нечто вроде такого:
M>>