我正在使用Python3在MySQL中插入数百万行,但我发现内存使用量一直在增长,最终达到64GB。我试图诊断问题,这是问题的重现:说我有100个CSV文件。每个文件包含50000行,我想将它们插入数据库。这是示例代码:
import mysql.connector
insert_sql = ("INSERT INTO table (Value) VALUES (%s)")
for i in range(100):
cnx = mysql.connector.connect(user='root', password='password', host='127.0.0.1', database='database')
cursor = cnx.cursor()
# Insert 50000 rows here
for j in range(50000):
cursor.execute(insert_sql, (j,))
cnx.commit()
cursor.close()
cnx.close()
print('Finished processing one file')
print('All done')
该数据库仅包含1个表,其中包含2列:
CREATE TABLE `table` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`Value` int(11) NOT NULL,
PRIMARY KEY (`Id`)
)
环境:Mac OS Sierra; Python 3.6.x; MySQL 8.0.1; mysql-connector-python 8.0.11
我知道在提交之前内存应该增长,因为更改已被缓冲。但是我认为提交后它将减少。但是,不是。由于在我的实际应用程序中,我有成千上万个文件,每个文件100MB,因此我的内存将耗尽。
我在这里做错了吗? (我是数据库新手)如何控制内存使用量?任何建议将不胜感激!
编辑:我还根据注释和答案尝试了以下代码,但仍然无法正常工作:
import mysql.connector
insert_sql = ("INSERT INTO table (Value) VALUES (%s)")
for i in range(100):
cnx = mysql.connector.connect(user='root', password='password', host='127.0.0.1', database='database')
cursor = cnx.cursor()
params = [(j,) for j in range(50000)]
# If I don't excute the following insertion, the memory is stable.
cnx.executemany(insert_sql, params)
cnx.commit()
cursor.close()
del cursor
cnx.close()
del cnx
print('Finished processing one file')
print('All done')
答案 0 :(得分:0)
尝试批量执行,此插入循环可能是问题所在。
您可以执行:
c.executemany("INSERT INTO table (Value) VALUES (%s)",
[('a'),('b')])
或大插入语句,同时包含所有想要的值。