2016-09-14 4 views
5

を作ります。データベースには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つのドキュメントです。

+2

?結果のDFが250カラム以下の場合、PostgreSQLでそれらを結合することができます。また、それらをPostgreSQLに参加させることもできます。メモリエラーは発生しません。 – MaxU

+1

より良い解決方法をお手伝いするために究極の目的を教えてください。 –

+0

@MaxU、私は正確な数を覚えていませんが、私はカラムの数が250より大きいと確信しています。 – trex

答えて

0

私は、これは役立ちますが、あなたはpd.concat

raw_dict = pd.concat([d.set_index('USER_ID') for d in df_arr], axis=1) 

それとも、これが参考にされていない場合、もう少しdisctinction

raw_dict = pd.concat([d.set_index('USER_ID') for d in df_arr], axis=1, keys=sql_tables) 

を取得するために試みることができるかどうか分かりません、私に知らせて、私はそれを削除します。

+0

'pd.concat'実行中に次のエラーが発生します。https://gist.github.com/SergeyBondarenko/f78444f709cffec3e6777d3a16e38f2f – trex

1

なぜスクリプトの代わりにpostgres関数を作成しないのですか?ここで

一部はそれがメモリエラーを回避するために、あなたを助けることができる助言されています

  • あなたのメモリをより有効に利用します WITH句を使用することができます。
  • あなたは、データベースのテーブルの 異なるグループの情報を格納するためのいくつかの物理的なテーブルを作成することができます。これらの物理的なテーブルは、大量のメモリを使用することを避けます。その後、あなたがしなければならないのは、それらの物理的なテーブルだけに参加することだけです。そのための関数を作成することができます。
  • 必要なテーブルを非正規化することによってデータウェアハウスを作成できます。
  • なく、少なくとも最後に:あなたはインデックスを適切に使用していることを確認してください。あなたはすべての72個のテーブルに持っていますどのように多くの列
+0

合計カラム数が1600を超えています。 – trex

+0

データウェアハウスをお試しになるとどうなりますか? –

+0

どのデータウェアハウスサービスをお勧めしますか? – trex

関連する問題