Python 如何在使用SqlAlchemy ORM加载大型数据库时使用更少的内存?
我正在使用SqlAlchemy将一些大型数据集加载到MySQL数据库中。它大约有一百万行,并且正在计数(大约380MB的数据库大小)。我需要将此数据库加载到pandas数据框中,为此我使用如下代码: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是使用数据库的连
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,你有没有找到你问题的答案?