如何在不耗尽内存的情况下从SQL查询创建一个大型pandas数据?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (130)

我在从MSSQLServer数据库中查询一个>五百万条记录的表时遇到了困难.。我希望能够选择所有的记录,但是当选择内存中的很多数据时,我的代码似乎失败了。

这样做是可行的:

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文件创建数据文件时也存在类似的问题,而解决方法是使用“迭代器”和“块大小”参数,如下所示:

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

是否有类似的从SQL数据库查询的解决方案?

提问于
用户回答回答于

只需试着按块读取输入表,然后从各个部分组装完整的数据文件,如下所示:

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)

用户回答回答于

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

扫码关注云+社区