numpy や arrow などの高度に最適化された数学パッケージを使用して、Python でセカンダリ インメモリ インデックスを構築するための効率的なソリューションを探しています。パフォーマンス上の理由から、パンダを除外しています。
意味
「セカンダリ インデックスには、インデックスを作成する属性の既存の各値のエントリが含まれています。このエントリは、属性値をキーとして、値として、ベース テーブル内のすべてのレコードへのポインタのリストを持つキー/値のペアとして見ることができます。この価値があります。」- JV。D'Silva等。(2017)
簡単な例を見てみましょう。後でこれをスケーリングして、いくつかのベンチマークを生成できます。
import numpy as np
pk = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9], dtype='uint32')
val = np.array([15.5, 3.75, 142.88, 142.88, None, None, None, 7.2, 2.1], dtype='float32')
興味深いことに、 pyarrow.Array.dictionary_encodeメソッドは、値の配列を、セカンダリ インデックスに近い辞書エンコード表現に変換できます。
val.dictionary_encode()
Out[55]:
<pyarrow.lib.DictionaryArray object at 0x7ff430d8b4d0>
-- dictionary:
[
15.5,
3.75,
142.88,
nan,
7.2,
2.1
]
-- indices:
[
0,
1,
2,
2,
3,
3,
3,
4,
5
]
ここで問題を開きました
したがって、問題は、値とインデックスを効率的に保持するために、Python データ構造を使用してメモリ内にセカンダリ インデックスをどれだけ速く構築できるかということです。しかし、クエリのフィルタリング (ポイント、範囲) と変換 ( TRIADBのハイパーエッジとも呼ばれる行、列、および関連付けの再構築) の両方に役立つ場合、インデックスが役立つため、これは話の半分です。また、この簡単な説明でも、この種のインデックスの更新がいかに簡単かについては触れていません。
多くの理由から、私は PyArrow オープンソース ソリューションの可能性を調査し始めました。並べ替えられた辞書エンコード表現は、通常、メモリ フットプリントの縮小と高速で柔軟なゼロ コピー I/O 処理の優れた組み合わせにより、問題の要件を満たす必要があります。