Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Psycopg-从PostgreSQL选择大型数据集时出现内存错误_Python_Postgresql_Psycopg2 - Fatal编程技术网

Python Psycopg-从PostgreSQL选择大型数据集时出现内存错误

Python Psycopg-从PostgreSQL选择大型数据集时出现内存错误,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,因此,我有一个表,其中有146列,大约800万行稀疏数据存储在本地的Postgresql中 我的目标是一次选择整个数据集,将其存储到数据框中并执行一些计算 到目前为止,我已经在许多线程中读到了关于服务器端游标的内容,但我想我做错了什么,因为我没有看到内存的改进。文件也相当有限 到目前为止,我的代码如下: cur=conn.cursor('testCursor') cur.itersize = 100000 cur.execute("select * from events") df = cur

因此,我有一个表,其中有146列,大约800万行稀疏数据存储在本地的Postgresql中

我的目标是一次选择整个数据集,将其存储到数据框中并执行一些计算

到目前为止,我已经在许多线程中读到了关于服务器端游标的内容,但我想我做错了什么,因为我没有看到内存的改进。文件也相当有限

到目前为止,我的代码如下:

cur=conn.cursor('testCursor')
cur.itersize = 100000
cur.execute("select * from events")

df = cur.fetchall()

df = pd.DataFrame(df)
conn.commit()
conn.close()
我还尝试使用fetchmany或fetchone代替fetchall,但我不知道如何滚动结果。我想我可以在fetchone中使用类似的东西,但我不知道如何处理fetchmany:

df = cur.fetchone()
while row:
   row = cur.fetchone() 

最后,在fetchone和fetchmany的情况下,如何将结果集中到一个数据帧中而不消耗所有内存?请注意,我有16gb的可用RAM

8 mil rows x 146 columns,假设一个列存储至少一个字节,则至少会提供1GB。考虑到您的列可能每列存储超过一个字节,即使您尝试执行的第一步成功,您也会遇到RAM限制,例如,最终结果不适合RAM


处理大型数据集的通常策略是以小批量处理它们,然后在需要时合并结果。以PySpark为例。

是的,数据约为3.5 gb。假设我想多次使用fetch将数据处理成小批量,那么如何滚动结果呢?解决问题的一种方法是将整个日期表复制到一个列数据库(如MonetDB)中,并使用python执行分析,包括查询中的代码。MonetDB允许您将python代码嵌入查询中。这是一个内置功能。这里有一个示例ref:。希望这对你有用。当然,谢谢!如果你找不到任何解决办法,我会试试