Python 如何将更多的数据从PostgreSQL查询流式传输到拼花地板文件,而不是存储在内存中?

Python 如何将更多的数据从PostgreSQL查询流式传输到拼花地板文件,而不是存储在内存中?,python,psycopg2,parquet,pyarrow,Python,Psycopg2,Parquet,Pyarrow,我有下面的代码查询一个大约500k行的数据库。当点击rows=cur.fetchall()时,它会抛出一个SIGKILL。我尝试遍历游标,而不是将其全部加载到行中,但它似乎仍然会导致OOM问题 如何从数据库中获取所有数据并将其安全地转换为拼花地板文件,而不考虑表的大小 def get_parquet_for_dataset_id(self, dataset, lob, max_dt): query = _table_query(lob, table_name, max_dt)

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

如何从数据库中获取所有数据并将其安全地转换为拼花地板文件,而不考虑表的大小

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;

服务器端游标,请参阅:

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

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


收到数据后,您将如何处理这些数据?您真的需要将其存储在内存中吗?你能把它流出来吗,就像从迭代器中分块生成数据一样?(一个关于如何在拼花文件中存储大于内存的数据的问题,如果不清楚如何存储的话,可能属于一个专门关于创建该文件所使用的Python接口或库的问题,而不是关于PostgreSQL;在编写文件方面需要更改的代码都不是currentl问题中包含y)。@CharlesDuffy未到达需要将其写入拼花地板文件的部分。尝试执行
cur.fetchall()时失败
因此,我想关于拼花地板文件的问题现在是无关紧要的,但是如果有一种方法可以避免将所有这些内容写入内存,那么这将是一种理想的方法。对;众所周知,对于大于内存的数据,您根本不应该执行
fetchall()
(从表面上看,这应该是显而易见的;您无法获取无法放入流程空间的内容)…这就是
fetchmany()的全部原因
存在,因此您可以一次获取较小的行集合,并重复该操作,直到处理完所有行。当然,如果一次获取较小的集合,则需要能够以增量方式将它们添加到拼花文件中(因此,您可以停止将它们存储在内存中——因为如果您只是将每个
fetchmany()
的结果添加到存储在RAM中的列表中,您就回到了原来的问题),并且需要有代码来完成这一点,这就是为什么在没有更多内容的情况下无法回答这个问题。不幸的是,OP的问题远远超出了他们的标题——请参阅文本中的“并安全地将其转换为拼花文件”部分。(由于它们没有包含用于此目的的代码,因此很可能有理由以缺少代码来结束此问题;但无论如何,答案并不能真正解决此问题)。