我在查询MS SQL Server数据库中超过500万条记录的表时遇到问题。我想选择所有的记录,但是在内存中选择太多数据时,我的代码似乎失败了。
这是可行的:
import pandas.io.sql as psql
sql = "SELECT TOP 1000000 * FROM MyTable"
data = psql.read_frame(sql, cnxn)
...but这不起作用:
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 *查询似乎有很多工作要做。当然还有一种更简单的方法。
发布于 2015-04-09 02:22:49
正如评论中提到的,从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
发布于 2019-08-27 00:44:41
代码解决方案和备注。
# Create empty list
dfl = []
# Create empty dataframe
dfs = pd.DataFrame()
# Start Chunking
for chunk in pd.read_sql(query, con=conct, ,chunksize=10000000):
# Start Appending Data Chunks from SQL Result set into List
dfl.append(chunk)
# Start appending data from list to dataframe
dfs = pd.concat(dfl, ignore_index=True)
然而,我的内存分析告诉我,即使在提取每个块之后释放内存,列表也会越来越大,并占用该内存,从而导致在空闲RAM上没有净收益。
我想听听作者/其他人有什么要说的。
发布于 2021-11-19 21:42:19
我找到的处理此问题的最佳方法是利用SQLAlchemy steam_results连接选项
conn = engine.connect().execution_options(stream_results=True)
并将conn对象传递给pandas
pd.read_sql("SELECT *...", conn, chunksize=10000)
这将确保在服务器端而不是客户端处理游标
https://stackoverflow.com/questions/18107953
复制相似问题