postgresql Psycopg 2-如何执行大型查询-超过100万行

xghobddn  于 2023-01-08  发布在  PostgreSQL
关注(0)|答案(1)|浏览(209)

因此,我尝试从本地的postgresql数据库中进行大量查询。
“processrecords”函数返回一个listofmalwareobjects,我假设每次服务器端光标运行时,我都需要向主列表添加一个新列表。
我有点困惑,该怎么做才合适呢?
我想我需要使用服务器端游标,否则程序会耗尽Psycopg2的内存。但是我听说过关于服务器端游标的好消息。

with connection:

    cursor = connection.cursor()
    with cursor:
        cursor.itersize = 20000
        cursor.execute("SELECT malware_id, malwarehashmd5, malwarehashsha1, malwarehashsha256g FROM malwarehashesandstrings")
        listoffetchedmalware = cursor.fetchall()

        listofmalwareobjects = processrecords(listoffetchedmalware)
jq6vz3qz

jq6vz3qz1#

有关文档:
Psycopg将数据库服务器端游标 Package 在命名游标中。命名游标是使用cursor()方法指定 * name * 参数创建的。
试试看:

with connection:

    cursor = connection.cursor('my_cursor')
    ...

但是,fetchall()仍然会一次返回所有行。如果您希望以bucket为单位处理数据,请在循环中使用fetchmany(),例如:

with connection.cursor(name="my_cursor") as cursor:

    cursor.itersize = 20000
    cursor.execute(the_query)
    
    listoffetchedmalware = cursor.fetchmany(cursor.itersize)
    
    while len(listoffetchedmalware) > 0:
    
        listofmalwareobjects = processrecords(listoffetchedmalware)
        listoffetchedmalware = cursor.fetchmany(cursor.itersize)

相关问题