Если вы хотите оптимизировать использование памяти, вам придется использовать шаблоны в ваших данных. Если распределение значений в ваших кортежах не является действительно случайным, должны быть некоторые из 10 позиций, которые имеют меньше различных значений, чем другие. Это то, что древовидное хранилище может использовать для уменьшения использования памяти.
Например, для 1 миллиона кортежей, если первый элемент в кортежах имеет только значения 3, 5 и 9 во всех кортежах, сохраняя 9 элементов кортежи суффиксов в словаре из 3 наборов должны сохранять пространство, эквивалентное 999997 целым числам (теоретически):
{
3: set(of all 9-tuples that should be prefixed by 3)
5: set(of all 9-tuples that should be prefixed by 3)
9: set(of all 9-tuples that should be prefixed by 3)
}
Вы можете сделать это для нескольких уровней префикса на основе x наименее различных позиций, вплоть до точка, где накладные расходы на словари перевешивают экономию.
{
(3,7): set(of all 8-tuples that should be prefixed by (3,7) )
(3,1): set(of all 8-tuples that should be prefixed by (3,1) )
(3,4): set(of all 8-tuples that should be prefixed by (3,4) )
(5,4): set(of all 8-tuples that should be prefixed by (5,4) )
...
}
Конечно, наименее различающиеся элементы могут не быть первыми, поэтому вам может потребоваться некое сопоставление, чтобы изменить порядок позиций в этом словаре.
Проблема с тестированием этого вида оптимизации хранилища на случайно сгенерированных данных состоит в том, что сама случайность элементов сводит на нет цель иерархического хранилища и бросает его в худшем случае. Даже если у вас есть какая-то комбинация позиций, которая уменьшает количество различных значений, все равно придется уменьшить счетчик размера префикса на большее пространство, чем добавленные накладные расходы иерархической структуры (мои тесты показывают, что наборы очень эффективны при хранении кортежи небольших целых чисел, поэтому их будет сложно превзойти)
Короче говоря, если вы знаете, что ваши данные имеют некоторые шаблоны распределения, которые позволят вам выбрать хороший уровень группировки, вы сможете извлечь выгоду из Tr ie или PrefixSet, сопоставляя позиции с их структурой (а также не давая им управлять целыми кортежами). В противном случае будет очень сложно добиться сколько-нибудь значимой экономии памяти.