Я занимаюсь обработкой javascript 3D, и у меня есть очень большое количество объектов (например, объект A), каждый из которых содержит некоторый материал и массив положительных целых чисел, таких как [0, 1, 4], [ 1, 5, 74, 1013] и т.д. Им не нужно иметь личное значение, все объекты могут использовать один и тот же список. Количество томов может идти от 0 до нескольких тысяч, скажем, 65 тыс. (Короткое).
Профилирование показало, что массивы thoses едят много памяти. При вычислении моя программа достигает более 2 Гбайт выделенной памяти, это не какой-то случай глупой предварительной оптимизации.
У меня есть 2 вывода для оптимизации памяти:
- найти более эффективный способ хранения списков тиков (возможно, массив бит в больших числах?)
- Найдите способ избежать дублирования. Например, мне удалось обнаружить, что некоторые массивы (например, [0,1,2,3,4,5,6]) присутствовали в более чем 40 000 объектов A. Возможно, хранение массивов thoses в древовидной структуре и создание моих объектов Точка к нему поможет?
Есть ли у вас предложение?
EDIT: Я забыл упомянуть об этом, но это важно: каждое целое число в списке UNIQUE. EDIT2: Единственная важная вещь, которую нужно извлечь, - это SET целых чисел, порядок не важен.
Я собираюсь преобразовать массивы thoses в "Big Integer" с побитовыми операциями, т.е. создать Big Integer с некоторым классом, установить биты 1, 5, 74, 1013, преобразовать большой int в строку (массив 8 байтов) и сохранить строку, но она не всегда будет усилением (например, массив [4000] будет представлен как строка длиной в 500 байт...)
Объем проекта (бесполезен, но меня просили об этом)
Это должно быть бесполезно, чтобы ответить на вопрос, но меня просили об этом несколько раз, я ставлю его здесь.
Я строю 3D-сетку объемных объектов, чтобы упростить, позвольте предположить, что у меня много сфер. Я знаю их положение (в центре, луч), и я хочу рисовать их в одной 3D-сетке. Для этого у меня есть структура памяти, называемая Octree, которая позволяет мне разделить 3D-пространство в нижних ячейках (узлы октавы) вокруг поверхность моего объекта. Затем я смогу создать сетку из ячеек thoses.
Ячейки Thoses - это то, что я назвал объектом A в описании. Каждая ячейка содержит список идентификаторов (положительные целые числа), которые указывают на объекты сферы, которые ячейка пересекает.
Факт заключается в том, что профилирование показало, что массивы клеток thoses сохраняют в памяти несколько сотен МБ. Я хотел бы уменьшить это число, найдя способ удалить все дубликаты и/или, если возможно, найти более эффективный способ хранения списка положительных идентификаторов (может идти от 0 до 65 тыс.).