gpt4 book ai didi

python - 为什么在 Python 中获取 postgreSQL 表比在 R 中慢得多?

转载 作者:行者123 更新时间:2023-12-05 04:06:35 29 4
gpt4 key购买 nike

我必须对存储在 PostgreSQL 表中的数据进行一些统计处理。我一直在使用 R 和 Python 之间犹豫不决。

对于 RI,我使用以下代码:

require("RPostgreSQL")
(...) #connection to the database, etc
my_table <- dbGetQuery(con, "SELECT * FROM some_table;")

速度非常快:只需 5 秒即可获取包含约 200 000 行和 15 列且其中几乎没有 NULL 的表。

对于 Python,我使用以下代码:

import psycopg2  
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
cursor.execute("SELECT * FROM some_table;")
my_table = cursor.fetchall()

令人惊讶的是,它会导致我的 Python session 卡住并且我的计算机崩溃。

当我将这些库用作“黑匣子”时,我不明白为什么在 R 中如此快的东西在 Python 中却那么慢(因此几乎不可能用于实际用途)。

谁能解释这种性能差异,谁能告诉我是否存在更有效的方法来用 Python 获取 pgSQL 表?

最佳答案

我不是 R 方面的专家,但很明显 dbGetQuery()(实际上:dbFetch())返回的是一个惰性对象,不会加载所有结果内存 - 否则它当然会花费很长时间并吃掉你所有的 ram。

wrt/Python/psycopg,你绝对不想 fetchall() 一个巨大的数据集。这里的正确解决方案是 use a server-side cursor并迭代它。

编辑 - 回答您评论中的问题:

so the option cursor_factory=psycopg2.extras.DictCursor when executing fetchall()does the trick, right?

完全没有。正如我所链接的示例中的所有字母所写,“有用”的是使用服务器端游标,这是通过命名游标完成的(在 psycopg 中):

HERE IS THE IMPORTANT PART, by specifying a name for the cursor psycopg2 creates a server-side cursor, which prevents all of the records from being downloaded at once from the server.

cursor = conn.cursor('cursor_unique_name')

DictCursor 的东西实际上是无关紧要的(在这个例子中不应该被提及,因为它显然会让新手感到困惑)。

I have a side question regarding the concept of lazy object (the one returned in R). How is it possible to return the object as a data-frame without storing it in my RAM? I find it a bit magical.

正如我提到的,我对 R 和它的实现不感兴趣 - 我从你描述的行为中推断出无论 dbFetch 返回什么都是一个惰性对象 - 但是拥有一个对象并没有什么神奇的懒惰地从外部源获取值。 Python 的 file 对象是一个已知的例子:

with open("/some/huge/file.txt") as f:
for line in f:
print line

在上面的代码片段中,file 对象 f 仅在需要时从磁盘中获取数据。需要存储的只是文件指针位置(以及从磁盘读取的最后 N 个字节的缓冲区,但这是一个实现细节)。

想了解更多,read about Python's iteratable and iterator .

关于python - 为什么在 Python 中获取 postgreSQL 表比在 R 中慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49769683/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com