Я хотел бы знать, что лучше всего подходит для эффективного хранения (и последующего доступа к )наборам многомерных -массивов данных с переменной длиной. Основное внимание уделяется производительности, но мне также нужно иметь возможность обрабатывать изменение длины отдельного набора данных во время выполнения без особых накладных расходов.
Примечание :Я знаю, что это довольно длинный вопрос, но я довольно много просмотрел и не смог найти решение или пример, который описывает проблему с достаточной точностью.
Фон
Контекст представляет собой код вычислительной гидродинамики (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
, поэтому количество точек данных, которые я сохраняю для каждой ячейки, также может меняться во время выполнения.
Заключение
Любой вклад приветствуется. Если у вас есть собственный опыт или вы просто знаете несколько хороших ресурсов, на которые я мог бы обратить внимание, дайте мне знать. Однако, хотя решение будет иметь решающее значение для выполнения окончательной программы, это всего лишь одна из многих проблем, поэтому решение должно носить прикладной характер, а не чисто академический.
Если это неправильное место, чтобы задать этот вопрос, пожалуйста, дайте мне знать, какое место было бы более подходящим.