Psycopg2 - 如何进行大型查询 - 超过 100 万行

Psycopg2 - How to Do Large Query - 1 Million Plus Rows

所以我正在尝试从本地的 postgresql 数据库进行大量查询。

'processrecords' 函数,returns 一个恶意软件对象列表,我假设每次服务器端光标 运行 时我都需要向主列表添加一个新列表.

我有点困惑,我该如何正确执行此操作。

我认为我需要使用服务器端游标,否则程序 运行 会因 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)

对于the documentation

Psycopg wraps the database server side cursor in named cursors. A named cursor is created using the cursor() method specifying the name parameter.

尝试:

with connection:

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

但是,fetchall() 仍然会同时 return 所有行。如果要处理桶中的数据,请在循环中使用 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)