当前位置: 首页 > 知识库问答 >
问题:

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

楚流觞
2023-03-14

我无法从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
read_csv('exp4326.csv', iterator=True, chunksize=1000)

共有1个答案

常自强
2023-03-14

更新:请确认下面的答案,因为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)

也可能是整个数据帧太大,内存无法容纳,在这种情况下,除了限制所选择的行或列的数量之外,您没有其他选择。

 类似资料:
  • 问题内容: 我无法从MS SQL Server数据库查询超过500万条记录的表。我想选择所有的记录,但我的代码似乎选择以多数据时到内存失败。 这有效: …但这不起作用: 它返回此错误: 我在这里已经读到,从csv文件创建时存在类似的问题,解决方法是使用“ iterator”和“ chunksize”参数,如下所示: 从SQL数据库查询是否有类似的解决方案?如果没有,首选的解决方法是什么?我是否应该

  • 问题内容: 我有一个android客户端,可通过REST风格的端点和JSON与服务器进行通信。因此,我需要先检索完整的服务器响应,然后再将其转换为哈希。我有以下代码可以做到这一点(可以在某个地方的互联网上找到): 该代码在大多数情况下有效,但是我在行中看到OutOfMemory异常的客户端发生崩溃的报告: 完整的堆栈跟踪为: 我的问题:除了从服务器发送较小的数据块外,还有什么方法可以解决此问题?

  • 在C语言中,我可以用和调用来创建新文件,当且仅当当前没有同名文件时。我还没能在哈斯克尔找到这样做的方法。我更喜欢提供的友好的东西,最好是为我完成所有棘手的异常处理。(我不一定期望它能正确地为我完成,但那是另一回事。)

  • 我确信这是一个简单的SQLContext问题,但我在Spark docs或Stackoverflow中找不到任何答案 我想从MySQL上的SQL查询创建一个Spark数据框 例如,我有一个复杂的MySQL查询,如 我想要一个带有X、Y和Z列的数据帧 我想出了如何将整个表加载到Spark中,然后可以将它们全部加载,然后在那里进行连接和选择。然而,这是非常低效的。我只想加载SQL查询生成的表。 这是我

  • 我有一个具有两个属性的dynamoDB表: A: 主分区键 B: 主排序键 我想使用属性B查询这个表,因为我不知道A的值。可以这样做吗? 是否可以将B设为GSI(全局二级索引),如何使用B查询表,因为B已经是排序键。

  • 我已成功地将数据保存在SQLite DB中。但我在从SQLite数据库读取数据时出现了一个错误,然后我的应用程序崩溃了。 错误信息 如果你需要任何其他信息,请告诉我。