Я хотел бы знать, что лучше всего подходит для эффективного хранения (и последующего доступа) наборов многомерных массивов данных с переменной длиной. Основное внимание уделяется производительности, но мне также нужно иметь возможность обрабатывать изменение длины отдельного набора данных во время выполнения без особых накладных расходов.
Примечание. Я знаю, что это довольно длинный вопрос, но я довольно много просмотрел и не смог найти решение или пример, который описывает проблему с достаточной точностью.
Фон
Контекст представляет собой код вычислительной гидродинамики (CFD), основанный на методе разрывных спектральных элементов Галеркина (DGSEM) (см. Коприва (2009), Реализация спектральных методов для уравнений с частными производными). Для простоты предположим, что данные представлены в 2D (на самом деле они трехмерные, но переход от 2D к 3D должен быть простым).
У меня есть сетка, состоящая из K
квадратных элементов k
(k = 0,...,K-1
), которые могут быть разных (физических) размеров. В каждом элементе сетки (или «ячейке») k
у меня есть N_k^2
точек данных. N_k
— это количество точек данных в каждом измерении, которое может варьироваться в зависимости от ячейки сетки.
В каждой точке данных n_k,i
(где i = 0,...,N_k^2-1
) я должен хранить массив значений решения, который имеет одинаковую длину nVars
во всем домене (т.е. везде) и который не меняется во время выполнения.
Размеры и изменения
Количество ячеек сетки K
составляет от O(10^5)
до O(10^6)
и может изменяться во время выполнения.
Количество точек данных N_k
в каждой ячейке сетки составляет от 2
до 8
и может > изменяются во время выполнения (и могут быть разными для разных ячеек).
Количество переменных nVars
, хранящихся в каждой точке сетки, составляет от 5
до 10
и не может изменяться во время выполнения (это также одно и то же для каждой ячейки сетки).
Требования
Производительность является ключевым вопросом здесь. Мне нужно иметь возможность регулярно и упорядоченно выполнять итерации по всем точкам сетки всех ячеек эффективным образом (т.е. без слишком большого количества промахов кеша). Как правило, K
и N_k
не меняются очень часто во время моделирования, поэтому, например, можно использовать большой непрерывный блок памяти для всех ячеек и точек данных.
Однако мне нужно иметь возможность уточнять или огрублять сетку (т.е. удалять ячейки и создавать новые, новые могут быть добавлены в конец) во время выполнения. Мне также нужно иметь возможность изменить порядок аппроксимации N_k
, поэтому количество точек данных, которые я сохраняю для каждой ячейки, также может меняться во время выполнения.
Заключение
Любой вклад приветствуется. Если у вас есть собственный опыт или вы просто знаете несколько хороших ресурсов, на которые я мог бы обратить внимание, дайте мне знать. Однако, хотя решение будет иметь решающее значение для выполнения окончательной программы, это всего лишь одна из многих проблем, поэтому решение должно носить прикладной характер, а не чисто академический.
Если это неправильное место, чтобы задать этот вопрос, пожалуйста, дайте мне знать, какое место было бы более подходящим.