sli*_*izb 35 python sql bigdata pandas
我无法从MS SQL Server数据库查询大于500万条记录的表.我希望能够选择所有记录,但在选择大量数据到内存时,我的代码似乎失败了.
这有效:
import pandas.io.sql as psql
sql = "SELECT TOP 1000000 * FROM MyTable"
data = psql.read_frame(sql, cnxn)
Run Code Online (Sandbox Code Playgroud)
...但这不起作用:
sql = "SELECT TOP 2000000 * FROM MyTable"
data = psql.read_frame(sql, cnxn)
Run Code Online (Sandbox Code Playgroud)
它返回此错误:
File "inference.pyx", line 931, in pandas.lib.to_object_array_tuples
(pandas\lib.c:42733) Memory Error
Run Code Online (Sandbox Code Playgroud)
我在这里读到,从csv文件创建数据帧时存在类似的问题,并且解决方法是使用'iterator'和'chunksize'参数,如下所示:
read_csv('exp4326.csv', iterator=True, chunksize=1000)
Run Code Online (Sandbox Code Playgroud)
是否有类似的SQL数据库查询解决方案?如果没有,首选的解决方法是什么?我是否需要通过其他方法读取块中的记录?我在这里阅读了一些关于在pandas中处理大型数据集的讨论,但执行SELECT*查询似乎需要做很多工作.当然有一种更简单的方法.
ksi*_*ndi 43
正如评论中提到的,从pandas 0.15开始,你有一个chunksize选项read_sql来读取和处理chunk的查询块:
sql = "SELECT * FROM My_Table"
for chunk in pd.read_sql_query(sql , engine, chunksize=5):
print(chunk)
Run Code Online (Sandbox Code Playgroud)
参考:http://pandas.pydata.org/pandas-docs/version/0.15.2/io.html#querying
The*_*ist 35
更新:请务必查看下面的答案,因为Pandas现在已经内置了对分块加载的支持.
您可以简单地尝试以块为单位读取输入表,然后从各个部分组装完整的数据帧,如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
整个数据帧可能太大而无法容纳在内存中,在这种情况下,除了限制您选择的行数或列数之外,您没有其他选择.
fly*_*our 10
代码解决方案和备注。
# 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)
Run Code Online (Sandbox Code Playgroud)
但是,我的内存分析告诉我,即使在提取每个块后释放内存,列表也会越来越大并占用该内存,导致可用 RAM 净净无增益。
很想听听作者/其他人怎么说。
| 归档时间: |
|
| 查看次数: |
48409 次 |
| 最近记录: |