2017-05-12 3 views
0

だから私は146のカラムとおよそのテーブルを持っています。 PostgreSQLにローカルに保存されたスパースデータの8ミルの行。Psycopg - PostgreSQLから大規模なデータセットを選択するとメモリエラーが発生する

私の目標は、データセット全体を一度に選択し、それをパンダのデータフレームに保存して計算を実行することです。

これまでのところ、私は多くのスレッドでサーバー側のカーソルについて読んだことがありますが、私はメモリの改善が見られないので、何か間違っていると思います。ドキュメントもかなり限られている...これまで

私のコードは次のようである:

cur=conn.cursor('testCursor') 
cur.itersize = 100000 
cur.execute("select * from events") 

df = cur.fetchall() 

df = pd.DataFrame(df) 
conn.commit() 
conn.close() 

は私も代わりはfetchAllのfetchmany()またはfetchoneを()()を使用してみましたが、私は知りませんか結果をスクロールします。私は結果をCONCATする方法fetchmany()fetchoneの場合

df = cur.fetchone() 
while row: 
    row = cur.fetchone() 

最後に、()と:私は(私はfetchoneのために、このようなものを使用することができると思います)が、私はfetchmanyを処理する方法がわかりません()私の記憶をすべて消費することなく単一のデータフレームに変換できますか?私は利用可能なRAMが16GBであることに注意してください。

+0

あなたの問題へのアプローチは、柱状のDB(MonetDBなど)に日付テーブル全体をコピーし、クエリ内のコードを含むPythonで分析を実行することです。 MonetDBでは、Pythonコードをクエリに埋め込むことができます。これは組み込み機能です。ここでの例ref:https://www.monetdb.org/blog/voter-classification-using-monetdbpython これはあなたにとって役に立ちます。 –

+0

ありがとうございます! Postgresで解決策が見つからない場合は、試してみてください – lacrima

答えて

0

8ミルの行×146列(少なくとも1バイトが格納されていると仮定した場合)は、少なくとも1 GBになります。あなたの列にはおそらく1列あたりのバイト数以上が格納されていることを考慮すると、何をしようとしている最初のステップで成功したとしても、最終的な結果はRAMに収まりません。

大規模なデータセットを処理する通常の戦略は、小さなバッチで処理し、(必要に応じて)結果を結合することです。たとえば、PySparkを見てみましょう。

+0

はい、データは約3.5GBです。 fetchmany()を複数回使用してデータを小さなバッチに処理したい場合は、どうすれば結果をスクロールできますか? – lacrima

関連する問題