如何将超出内存容量的数据从 PostgreSQL 查询流式传输到 parquet 文件?

Cal*_*oon 6 python psycopg2 parquet pyarrow

我有下面的代码,它查询大约 500k 行的数据库。当它击中 时,它会抛出一个 SIGKILL rows = cur.fetchall()。我尝试迭代游标而不是将其全部加载到行中,但它似乎仍然会导致 OOM 问题。

无论表的大小如何,如何从数据库中获取所有数据并将其安全地转换为 parquet 文件?

def get_parquet_for_dataset_id(self, dataset, lob, max_dt):
        query = _table_query(lob, table_name, max_dt)
        conn = self.conns[lob]

        with conn:
            with conn.cursor(cursor_factory=extras.RealDictCursor) as cur:
                cur.execute(query)

                rows = cur.fetchall()

                table = rows_to_table(rows)
                pq_bytes = io.BytesIO()
                pq.write_table(table, pq_bytes)
                _ = pq_bytes.seek(0)

                return pq_bytes;

Run Code Online (Sandbox Code Playgroud)

Adr*_*ver 0

服务器端游标,请参见此处

当执行数据库查询时,Psycopg游标通常会获取后端返回的所有记录,并将它们传输到客户端进程。如果查询返回大量数据,客户端将分配相应大量的内存。

如果数据集太大而无法在客户端实际处理,则可以创建服务器端游标。使用这种游标,可以仅向客户端传输受控数量的数据,以便可以检查大型数据集,而无需将其完全保留在内存中。