Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.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 如何在使用SqlAlchemy ORM加载大型数据库时使用更少的内存?_Python_Mysql_Pandas_Sqlalchemy_Etl - Fatal编程技术网

Python 如何在使用SqlAlchemy ORM加载大型数据库时使用更少的内存?

Python 如何在使用SqlAlchemy ORM加载大型数据库时使用更少的内存?,python,mysql,pandas,sqlalchemy,etl,Python,Mysql,Pandas,Sqlalchemy,Etl,我正在使用SqlAlchemy将一些大型数据集加载到MySQL数据库中。它大约有一百万行,并且正在计数(大约380MB的数据库大小)。我需要将此数据库加载到pandas数据框中,为此我使用如下代码: table_query = db_conn.Session.query(TableClass).yield_per(10000) df = pd.read_sql(table_query.statement, table_query.session.bind) 其中,db_conn是使用数据库的连

我正在使用SqlAlchemy将一些大型数据集加载到MySQL数据库中。它大约有一百万行,并且正在计数(大约380MB的数据库大小)。我需要将此数据库加载到pandas数据框中,为此我使用如下代码:

table_query = db_conn.Session.query(TableClass).yield_per(10000)
df = pd.read_sql(table_query.statement, table_query.session.bind)
其中,db_conn是使用数据库的连接字符串和该表的
TableClass
ORM对象定义的,会话定义为
db_conn.session=sessionmaker(bind=self.engine)

当我运行这个程序时,我的服务器RAM使用率几乎达到了6.5 GB。这很奇怪,因为实际的桌子并没有那么大。随着数据库每天的增长,这将很快完全填满机器中的8GB RAM


我能做些什么来防止这个巨大的内存使用问题?我做的一件事是使用
yield\u for
将数据分块获取,但这一点都没有帮助。

那么,在加载完表之后,内存使用量会下降到合理的水平吗?你在处理什么样的数据?你能打印出df.dtypes的输出吗?我从sql加载数据的经验是,需要大量内存,因为有一个中间步骤需要将sql表移动到内存很重的python数据结构中。@juanpa.arrivillaga通常有大约50列,因此我认为在这个问题中打印会有点长。它是日期、字符串(最大varchar(255)但不是长文本)、数字整数和浮点等的组合。是的,加载表后内存会下降。这无疑会降低速度,但您可能希望迭代
游标。fetchall()
,或者通过获取一些数据块来成批累积这些数据,并手动附加到数据帧。编辑:实际上不确定
mysql
cursor的工作方式,但是你应该能够找到一个让你懒洋洋地迭代查询结果的方法。请阅读Hi@sfactor,你有没有找到你问题的答案?那么,在加载完表之后,内存使用量会下降到合理的水平?你在处理什么样的数据?你能打印出df.dtypes的输出吗?我从sql加载数据的经验是,需要大量内存,因为有一个中间步骤需要将sql表移动到内存很重的python数据结构中。@juanpa.arrivillaga通常有大约50列,因此我认为在这个问题中打印会有点长。它是日期、字符串(最大varchar(255)但不是长文本)、数字整数和浮点等的组合。是的,加载表后内存会下降。这无疑会降低速度,但您可能希望迭代
游标。fetchall()
,或者通过获取一些数据块来成批累积这些数据,并手动附加到数据帧。编辑:实际上不确定
mysql
cursor是如何工作的,但是你应该能够找到一个让你懒洋洋地迭代查询结果的方法。请阅读Hi@sfactor,你有没有找到你问题的答案?