当前位置: 首页 > 面试题库 >

如何在不耗尽内存的情况下通过sql查询创建大熊猫数据框?

钦景胜
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

我在这里已经读到,dataframe从csv文件创建时存在类似的问题,解决方法是使用“ iterator”和“
chunksize”参数,如下所示:

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

从SQL数据库查询是否有类似的解决方案?如果没有,首选的解决方法是什么?我是否应该使用其他方法来分块读取记录?我在这里阅读了一些有关在熊猫中使用大型数据集的讨论,但是执行SELECT
*查询似乎需要做很多工作。当然,有一种更简单的方法。


问题答案:

更新:请确保检查以下答案,因为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万条记录的表。我想选择所有的记录,但我的代码似乎失败时选择多数据到内存。 这是可行的: ...但这不起作用:

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

  • 问题内容: 我有一个名为“ df”的熊猫数据集。 我该如何做以下事情? 谢谢。 对于那些了解R的人,有一个名为sqldf的库,您可以在R中执行SQL代码,我的问题基本上是,是否在python中有像sqldf这样的库 问题答案: 这不应该做,您可以看一下包(与R中的一样) 更新2020-07-10 更新

  • 我正在开发一个企业应用程序,管理员在其中创建新用户(没有注册表单)。我正在使用Firebase Auth,它在很多方面都很棒,但我在我的用例中遇到了一个问题。当您使用时,由此创建的用户将自动登录。当管理员创建用户帐户时,这显然不起作用。有没有办法避免这种行为?谢了。

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

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