我无法从 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
我已阅读 here从 csv 文件创建 dataframe
时存在类似问题,解决方法是使用 'iterator' 和 'chunksize' 参数,如下所示:
read_csv('exp4326.csv', iterator=True, chunksize=1000)
是否有类似的从 SQL 数据库查询的解决方案?如果没有,首选的解决方法是什么?我应该使用其他一些方法来分 block 读取记录吗?我读了一些讨论here关于在 pandas 中处理大型数据集,但执行 SELECT * 查询似乎需要做很多工作。当然有更简单的方法。
最佳答案
正如评论中提到的,从 pandas 0.15 开始,您在 read_sql
中有一个 chunksize 选项来逐 block 读取和处理查询:
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
关于python - 如何在不耗尽内存的情况下从 sql 查询创建 Pandas 数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18107953/