を作ります。データベースには72のテーブルがあります。列の総数はより大きい。は私が<strong>すべて</strong> PostgreSQLのテーブルを結合し、Pythonの辞書にそれらを変換するために必要なすべてのPostgreSQLのテーブルに参加して、Pythonの辞書
私はいくつかのテーブルを結合するが、原因the memory errorにそれらのすべてを結合するために失敗した簡単なPythonスクリプトを書きました。すべてのメモリは、スクリプトの実行中に占有されます。そして私は128GB RAMと8 CPUを持つ新しい仮想サーバーでスクリプトを実行します。ラムダ関数の実行中に失敗します。
は、どのように次のコードが参加すべてのテーブルを実行するために改善されるだろうか?
from sqlalchemy import create_engine
import pandas as pd
auth = 'user:pass'
engine = create_engine('postgresql://' + auth + '@host.com:5432/db')
sql_tables = ['table0', 'table1', 'table3', ..., 'table72']
df_arr = []
[df_arr.append(pd.read_sql_query('select * from "' + table + '"', con=engine)) for table in sql_tables]
df_join = reduce(lambda left, right: pd.merge(left, right, how='outer', on=['USER_ID']), df_arr)
raw_dict = pd.DataFrame.to_dict(df_join.where((pd.notnull(df_join)), 'no_data'))
print(df_join)
print(raw_dict)
print(len(df_arr))
私の目的にはPandasを使用してもよろしいですか?より良い解決策はありますか?
最終的な目標は、Elasticsearchにインデックスを付けることができるDBデータであり、ユーザーあたり1つのドキュメントです。
?結果のDFが250カラム以下の場合、PostgreSQLでそれらを結合することができます。また、それらをPostgreSQLに参加させることもできます。メモリエラーは発生しません。 – MaxU
より良い解決方法をお手伝いするために究極の目的を教えてください。 –
@MaxU、私は正確な数を覚えていませんが、私はカラムの数が250より大きいと確信しています。 – trex