パンダを使用して大きな (120GB; 10 億行) HDF5 ファイルを作成しました。hdf ファイルを最初に作成した後、次のようにファイルに追加しました。
with pd.get_store(path_output) as hdf_output:
for i in range(BIG_LOOP):
df = ...
hdf_output.append('all', df, data_columns=[])
作成時のインデックス作成を避けるために、意図的に data_columns=[] を設定しました。HDF ファイルができたので、いくつかの列にインデックスを追加したいと思います (たとえば、columns_to_index=['A', 'B', 'C'])。
どういうわけか、私は現在持っている ptdump によるとdata_columns:=['A']
、それがどのように起こったか思い出せません。(おそらく、最初の df は別のパラメーターで書き込まれました (数日間にわたって hdfstore に追加を続けていたので、何かを変更した可能性があります)。いずれにせよ、これがどのように作成されたかに関係なく、追加のインデックスを作成したいと思います。列。
どうやら、単に呼び出すだけでmystore.create_table_index('all', columns=['A', 'B', 'C'], optlevel=9, kind='full')
は機能しません。初めて実行したときは 1 時間攪拌され、ファイルサイズに 2 GB が追加されました (メタデータを調べると、チャンクサイズが増加したことが示されます) が、3 つのインデックスすべてがありません (「A」のインデックスのみ)。3 つの列すべてのインデックスを生成するにはどうすればよいですか?
また、ptdump に次の行があることにも気付きました。non_index_axes := [(1, ['A', 'B', 'C'])]
パンダでインデックスを作成できない場合は、pytables で直接これを行う方法についてアドバイスをいただければ幸いです。(たとえば、最初に既存のインデックスを削除する必要がありますか? また、「non_index_axes」と「data_coumns」を変更するにはどうすればよいですか?)
編集:私のユースケースに関する質問を予想して、これが私が達成しようとしていることの全体像です:
CSV ファイルから 120 GB のデータを読み取ります。各ファイルは 1 日の財務データを表し、1 行あたり約 12 列の 100,000 行で構成されています。HDF5ファイルにすべての行を順番に保存しています。この初期フェーズをすばやく実行したいので、インデックス作成をオフにします。現在、各 CSV ファイルを 6 秒で読み取って解析し、上記のように HDF5 ファイルに保存するにはわずか 1.5 秒しかかかりません。
列 1 に特定の文字列があり、列 2 の日付が特定の範囲にあるすべてのアイテムを取得するなど、さまざまなクエリをサポートするために、少数の (すべてではない) 列にインデックスを付けます。
時間が経つにつれて、毎日新しい CSV ファイルを解析し、それを HDF5 ファイルに追加します。今後も指数が更新されることを期待しています。
(私のアクセスパターンによっては、行を格納する順序 (現在は日付順) が引き続き取得に最適な順序である可能性があります。また、ほとんどのクエリで別の列で並べ替える必要が生じる可能性もあります。その場合、私は考えます各 CSV ファイルが解析されて追加された後、テーブルを再ソートする必要があります。)
現在、列インデックスを生成するステップ 2 で立ち往生しています。