Pandas SQL 块大小

问题描述 投票:0回答:2

这更多的是一个理解问题而不是编程问题。 我对 Pandas 和 SQL 很陌生。我正在使用 pandas 从 SQL 中读取具有特定块大小的数据。 当我运行 sql 查询时,例如 将 pandas 导入为 pd

df = pd.read_sql_query('select name, birthdate from table1', chunksize = 1000)

我不明白的是,当我不给出块大小时,数据存储在内存中,我可以看到内存在增长,但是,当我给出块大小时,内存使用量并不那么高。

我知道这个 df 现在包含许多数组,我可以将其访问为

for df_array in df:
    print df.head(5)

我在这里不明白的是,SQL 语句的整个结果是否保存在内存中,即 df 是一个携带多个数组的对象,或者它们是否像指向 SQL 查询创建的临时表的指针。

我很高兴能够了解这个过程的实际运作方式。

python sql-server pandas chunks
2个回答
30
投票

当您不提供

chunksize
时,查询的完整结果将立即放入数据框中。

当您提供

chunksize
时,
read_sql_query
的返回值是多个数据帧的迭代器。这意味着您可以像这样迭代:

for df in result:
    print df

并且在每个步骤中

df
是一个数据框(不是数组!),它保存查询的一部分的数据。请参阅有关此的文档:http://pandas.pydata.org/pandas-docs/stable/io.html#querying

要回答有关内存的问题,您必须知道从数据库检索数据有两个步骤:

execute
fetch

首先执行查询 (
result = con.execute()
),然后从结果集中以元组列表的形式获取数据 (
data = result.fetch()
)。获取时,您可以指定一次要获取多少行。这就是当你提供
chunksize
时 pandas 所做的事情。
但是,许多数据库驱动程序已经在执行步骤中将所有数据放入内存中,而不仅仅是在获取数据时。因此,从这方面来说,内存应该没有多大关系。除此之外,将数据复制到 DataFrame 中仅发生在使用
chunksize
进行迭代时的不同步骤中。


8
投票

它基本上是为了在您进行大量查询时阻止服务器内存不足。

输出为 CSV

for chunk in pd.read_sql_query(sql , con, chunksize=10000):
    chunk.to_csv(os.path.join(tablename + ".csv"), mode='a',sep=',',encoding='utf-8')

或外出使用镶木地板

count = 0
folder_path = 'path/to/output'

for chunk in pd.read_sql_query(sql , con, chunksize=10000):
    file_path = folder_path + '/part.%s.parquet' % (count)
    chunk.to_parquet(file_path, engine='pyarrow')
    count += 1
© www.soinside.com 2019 - 2024. All rights reserved.