Каков наиболее эффективный (и в то же время достаточно гибкий )способ хранения многомерных -данных переменной -длины?

Я хотел бы знать, что лучше всего подходит для эффективного хранения (и последующего доступа к )наборам многомерных -массивов данных с переменной длиной. Основное внимание уделяется производительности, но мне также нужно иметь возможность обрабатывать изменение длины отдельного набора данных во время выполнения без особых накладных расходов.

Примечание :Я знаю, что это довольно длинный вопрос, но я довольно много просмотрел и не смог найти решение или пример, который описывает проблему с достаточной точностью.

Фон

Контекст представляет собой код вычислительной гидродинамики (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, поэтому количество точек данных, которые я сохраняю для каждой ячейки, также может меняться во время выполнения.

Заключение

Любой вклад приветствуется. Если у вас есть собственный опыт или вы просто знаете несколько хороших ресурсов, на которые я мог бы обратить внимание, дайте мне знать. Однако, хотя решение будет иметь решающее значение для выполнения окончательной программы, это всего лишь одна из многих проблем, поэтому решение должно носить прикладной характер, а не чисто академический.

Если это неправильное место, чтобы задать этот вопрос, пожалуйста, дайте мне знать, какое место было бы более подходящим.

5
задан Michael Schlottke-Lakemper 10 July 2012 в 12:11
поделиться