python - 如何在不耗尽内存的情况下从 sql 查询创建 Pandas 数据框?

标签 python sql pandas bigdata

我无法从 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/

相关文章:

php - 在 codeigniter 上的 foreach 中的条件(排序依据)

python - 如何安装pandas在Eclipse下运行

python - 如何在 r 或 python 中查找并突出显示彼此一定范围内的值簇?

python - 我可以在没有 node.js 的情况下使用 Electron

php - mysql选择与id数组匹配的多行

php 选择并显示按分钟、小时、天排序的 sql 信息

python - Django - 模型字段的动态唯一测试

python - 如何在python中正确显示和隐藏GTK窗口

python - 根据用户来自的集群将值分配给用户

python - 具有多个 groupby 的 pandas pivot 数据框