可変長の多次元データ配列のセットを効率的に格納 (およびその後アクセス) するためのベスト プラクティスを知りたいです。焦点はパフォーマンスにありますが、実行時に個々のデータ セットの長さをあまりオーバーヘッドなく変更できるようにする必要もあります。
注:これはやや長い質問であることは承知していますが、かなり調べてみましたが、目前の問題を十分に正確に説明する解決策や例を見つけることができませんでした。
バックグラウンド
コンテキストは、不連続ガラーキン スペクトル要素法 (DGSEM) に基づく数値流体力学 (CFD) コードです (参照: Kopriva (2009), Implementing Spectral Methods for Partial Differential Equations )。簡単にするために、2D データ レイアウトを想定してみましょう (実際には 3 次元ですが、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)
があります。各グリッド セル
のデータ ポイントの数は、 と の間であり、実行時に変更される可能性があります (セルごとに異なる場合があります)。各グリッド ポイントに格納されている
変数の数は約 1 つであり、実行時に変更することはできません(すべてのグリッド セルでも同じです)。N_k
2
8
nVars
5
10
要件
ここではパフォーマンスが重要な問題です。すべてのセルのすべてのグリッド ポイントを効率的に (つまり、あまり多くのキャッシュ ミスを発生させずに) 順序付けられた方法で定期的に反復できる必要があります。一般に、K
およびN_k
はシミュレーション中にあまり頻繁に変更されないため、たとえば、すべてのセルとデータ ポイントに対して大規模な連続したメモリ ブロックを使用することもできます。
ただし、実行時にグリッドを調整または粗くする必要があります (つまり、セルを削除して新しいセルを作成します。新しいセルは最後に追加される場合があります)。また、近似順序を変更できるようにする必要があるためN_k
、各セルに保存するデータ ポイントの数も実行時に変更できます。
結論
どんな入力でも大歓迎です。ご自身での経験がある場合、または私が参照できるいくつかの優れたリソースを知っている場合は、お知らせください。ただし、解決策は最終的なプログラムのパフォーマンスにとって重要ですが、それは多くの問題の 1 つにすぎないため、解決策は純粋に学術的なものではなく、応用的な性質のものである必要があります。
この質問をする場所が間違っている場合は、より適切な場所を教えてください。