Плотный битовый вектор правдоподобен, но он не будет оптимальным, если вы не знаете, что у вас не будет более чем приблизительно 10**10
элементов, все кластеризованных рядом друг с другом, с разумно рандомизированным распределением. Если у вас другой дистрибутив, то другая структура будет лучше.
Например, если вы знаете, что в этом диапазоне, [0,10 ** 10), присутствует только несколько членов, используйте set()
, или, если верно обратное, почти каждый элемент присутствует, кроме дробь, используйте отрицательный набор, то есть element not in mySet
.
Если элементы стремятся сгруппироваться вокруг небольших диапазонов, вы можете использовать кодировку длины прогона, например, [xrange(0,10),xrange(10,15),xrange(15,100)]
, которую вы просматриваете, разбивая пополам, пока не найдете подходящий диапазон, и если индекс четный, тогда элемент находится в наборе. вставки и удаления включают немного перетасовку диапазонов.
Если ваш дистрибутив действительно плотный, но вам нужно немного больше, чем умещается в памяти (кажется, что это типично на практике), тогда вы можете управлять памятью, используя mmap
и оборачивая сопоставленный файл с помощью адаптера, который использует механизм, аналогичный предложенному array('I')
решению, уже предложенному.
Чтобы понять, насколько сжимаемы вы можете получить, попробуйте создать простой файл с разумным набором данных в упакованной форме, а затем примените общий алгоритм сжатия (такой как gzip), чтобы увидеть, какое сокращение вы видите. Если есть много сокращений, то вы, вероятно, также можете использовать некоторую оптимизацию пространства в вашем коде.