62

MS SQL Server データベースから 500 万件を超えるレコードのテーブルをクエリするのに問題があります。すべてのレコードを選択したいのですが、メモリに大量のデータを選択するとコードが失敗するようです。

これは機能します:

import pandas.io.sql as psql
sql = "SELECT TOP 1000000 * FROM MyTable" 
data = psql.read_frame(sql, cnxn)

...しかし、これは機能しません:

sql = "SELECT TOP 2000000 * FROM MyTable" 
data = psql.read_frame(sql, cnxn)

次のエラーが返されます。

File "inference.pyx", line 931, in pandas.lib.to_object_array_tuples
(pandas\lib.c:42733) Memory Error

ここで、csv ファイルから を作成するときに同様の問題が存在することを読みましたdataframe。回避策は、次のように「iterator」および「chunksize」パラメーターを使用することです。

read_csv('exp4326.csv', iterator=True, chunksize=1000)

SQL データベースからクエリを実行するための同様のソリューションはありますか? そうでない場合、推奨される回避策は何ですか? チャンクでレコードを読み取るために他の方法を使用する必要がありますか? pandas で大規模なデータセットを操作する方法について議論を少し読みましたが、SELECT * クエリを実行するのは大変な作業のようです。確かに、もっと簡単なアプローチがあります。

4

5 に答える 5

65

コメントで述べたように、pandas 0.15 以降では、チャンクごとread_sqlにクエリ チャンクを読み取って処理するための chunksize オプションがあります。

sql = "SELECT * FROM My_Table"
for chunk in pd.read_sql_query(sql , engine, chunksize=5):
    print(chunk)

参照: http://pandas.pydata.org/pandas-docs/version/0.15.2/io.html#querying

于 2015-04-08T18:22:48.623 に答える
55

更新: Pandas にはチャンク読み込みのサポートが組み込まれているため、以下の回答を必ず確認してください。

次のように、入力テーブルをチャンクごとに読み取り、後で個々の部分から完全なデータフレームを組み立てることができます。

import pandas as pd
import pandas.io.sql as psql
chunk_size = 10000
offset = 0
dfs = []
while True:
  sql = "SELECT * FROM MyTable limit %d offset %d order by ID" % (chunk_size,offset) 
  dfs.append(psql.read_frame(sql, cnxn))
  offset += chunk_size
  if len(dfs[-1]) < chunk_size:
    break
full_df = pd.concat(dfs)

データフレーム全体が大きすぎてメモリに収まらない可能性もあります。その場合、選択する行または列の数を制限する以外に選択肢はありません。

于 2013-08-07T16:10:16.237 に答える