Подойдите к проблеме с другого конца.Вместо того, чтобы задавать себе вопрос: «Как я могу сделать эту структуру данных меньше и при этом выделить их десятки миллионов?»Задайте себе вопрос: «Как я могу представить эти данные, используя совершенно другую структуру данных, которая гораздо более компактна?»
Похоже, вы создаете двунаправленный список bools, который, как вы заметили, использует тридцатьв пятьдесят раз больше памяти, чем нужно.Есть ли какая-то причина, почему вы не просто используете BitArray
для хранения своего списка bools?
ОБНОВЛЕНИЕ:
на самом деле я пыталсяреализовать разреженную булеву двумерную матрицу
Ну, почему ты так не сказал в первую очередь?
Когда я хочу создать разреженную булеву двумерную матрицу огромного размера, я создаю неизменное постоянное булево дерево quadree с запоминающейся фабрикой.Если массив разреженный или даже если он плотный, но в некотором роде самоподобный, вы можете получить огромных сжатий.Квадратные массивы 2 64 x 2 64 Булевы легко представимы, хотя, очевидно, в виде реального массива, это будет больше памяти, чем существует в мире.
Я думал о том, чтобы сделать серию статей в блогах по этой технике;Я, вероятно, сделаю это в конце марта.
Вкратце, идея состоит в том, чтобы создать абстрактный класс Quad, который имеет два подкласса: Single и Multi.«Одиночный» - это даблтон, похожий на синглтон, но с двумя экземплярами, которые называются Истинными и Ложными.Multi - это Quad с четырьмя подвалами, называемыми NorthEast, SouthEast, SouthWest и NorthWest.
Каждый квад имеет целое число "уровень";уровень сингла равен нулю, а мульти с уровня n необходим, чтобы все его дочерние элементы были четырехугольниками уровня n-1.
Фабрика Multi запоминается;когда вы просите его создать новый Multi с четырьмя дочерними элементами, он обращается к кешу, чтобы узнать, делал ли он это раньше.Если это так, он не создает новый;он раздает старый.Поскольку Quads являются неизменяемыми, вам не нужно беспокоиться о том, что кто-то заменит Quad после того, как он будет в кеше.
Теперь посмотрим, сколько слов памяти (слово составляет 4 или 8 байтов в зависимости от архитектуры)"all false" Multi уровня n потребляет.Уровень 1 "all false" multi использует четыре слова для ссылок на своих дочерних элементов, слово для подсчета уровня (если необходимо; вам не нужно сохранять уровень в multi, хотя это помогает для отладки) и пару словдля блока синхронизации и так далее.Давайте назовем это восемью словами.(Кроме того, память для квадрата False Single, который, как мы можем предположить, является константой двух или трех слов, и, следовательно, может игнорироваться.)
Уровень 2 "все ложные" мульти потребляет те же восемь слов, нокаждый из его четырех детей одного уровня 1 мульти .Следовательно, общее потребление мульти-уровня 2 «все ложно», скажем, 16 слов.
То же самое для уровня 3, 4, ... и так далее.Общее потребление памяти для мульти уровня 64, которое логически представляет собой квадратный массив логических выражений размером 2 64 x 2 64 , составляет всего 64 x 16 слов памяти!
Имеет смысл?Надеюсь, этого наброска хватит, чтобы начать.Если нет, см. Мой блог в конце марта.