Есть 3.48e9 вариантов 20-ти наборов индексов, которые равны 0,1,2. Если вы хотите сохранить 256-битное значение для каждого индекса, это означает, что вы говорите о 8,92e11 битах - о терабитах или о 100 ГБ.
Я не уверен, что вы пытаетесь сделать, но это звучит дорого в вычислительном отношении. Он может быть приемлемым в качестве файла с отображением в памяти и может быть достаточно быстрым в качестве файла с отображением в памяти на SSD.
Что вы пытаетесь сделать?
Таким образом, практическим решением было бы использовать 64-битную ОС и большой файл с отображенной памятью (предпочтительно на SSD) и просто вычислить адрес для данного элемента типичным способом для массивов, то есть как sum-of(forall-i(i-th-index * 3^i)) * 32 bytes
в псевдо-математике. Или используйте очень-очень дорогую машину с таким большим объемом памяти или другой алгоритм, который не требует этот массив.
Несколько замечаний по платформам: Windows 7 поддерживает только 192 ГБ памяти, поэтому использование физической памяти для подобной структуры возможно, но реально ее продвигает (более дорогие версии поддерживают больше). Если вы можете найти машину на все, что есть. Согласно странице Microsoft по этому вопросу виртуальное адресное пространство в пользовательском режиме составляет 7-8 ТБ, поэтому mmap / виртуальная память должна быть выполнимой. Алекс Ионеску объясняет , почему существует столь низкий предел виртуальной памяти, несмотря на явно 64-битную архитектуру . Википедия устанавливает адресные ограничения linux на 128 ТБ , хотя, вероятно, это до разделения ядра / пользовательского режима.
Предполагая, что вы хотите обратиться к такому многомерному массиву, вы должны обработать каждый индекс по крайней мере один раз: это означает, что любой алгоритм будет иметь значение O (N), где N - это число индексов. Как упоминалось ранее, вам не нужно преобразовывать в адресацию base-2 или что-либо еще, единственное, что имеет значение, - это то, что вы можете вычислить смещение integer - и то, на каком основании происходит математика, не имеет значения. Вы должны использовать максимально компактное представление и игнорировать тот факт, что каждое измерение не кратно 2.
Таким образом, для 16-мерного массива эта функция вычисления адреса может быть:
int offset = 0;
for(int ii=0;ii<16;ii++)
offset = offset*3 + indexes[ii];
return &the_array[offset];
Как уже говорилось, это обычная формула индексации массива, ничего особенного в этом нет. Обратите внимание, что даже для "всего лишь" 16 измерений, если каждый элемент составляет 32 байта, вы имеете дело с чуть более гигабайтом данных.