【发布时间】:2013-08-09 02:22:48
【问题描述】:
我无法从 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 数据库查询的解决方案?如果没有,首选的解决方法是什么?我应该使用其他一些方法来分块读取记录吗?我阅读了一些关于在 pandas 中处理大型数据集的讨论 here,但执行 SELECT * 查询似乎需要做很多工作。当然有更简单的方法。
【问题讨论】:
-
你有多少内存?
-
@PhillipCloud 我的机器有 4GB 内存。
-
取决于您的列的
dtype以及您可以轻松达到 4GB 的列数。例如, -
从 pandas 0.15 开始,您在
read_sql中有一个chunksize选项来逐块读取和处理查询块:pandas.pydata.org/pandas-docs/version/0.15.0/io.html#querying