我正试图加快将大型CSV文件加载到MySQL数据库的速度。使用此代码,加载4GB文件大约需要4个小时:
with open(source) as csv_file:
csv_reader = csv.reader(csv_file, delimiter=',')
next(csv_reader)
insert_sql = """ INSERT INTO billing_info_test (InvoiceId, PayerAccountId, LinkedAccountId) VALUES (%s, %s, %s) """
for row in csv_reader:
cursor.execute(insert_sql,row)
print(cursor.rowcount, 'inserted with LinkedAccountId', row[2], 'at', datetime.now().isoformat())
print("Committing the DB")
mydb.commit(
cursor.close()
mydb.close()
我想使用executemany()语句来加快速度。为此,您必须将元组列表传递给第二个参数。
如果我在每行迭代中构建列表,它将变得太大,并且当列表太大时,我将出现内存不足错误,并且脚本将崩溃。
我无法获得在范围声明中使用的csv_reader或csv_file长度。
我如何一次遍历CSV文件1000行,并将结果存储在列表中,在executemany中使用它,然后存储接下来的1000行,依此类推,直到CSV文件结束?
答案 0 :(得分:1)
如果您需要在mysql中进行高速插入,可以尝试使用:
LOAD DATA LOCAL INFILE '/path/to/my_file.csv' INTO TABLE my_table;
答案 1 :(得分:0)
一个小提示:
In [1]: import itertools
In [2]: rows = iter(range(10))
In [3]: while True:
...: batch = [*itertools.islice(rows, 3)]
...: if not batch:
...: break
...: print(batch)
...:
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9]
但是我应该同意@heliosk
的观点,更好的解决方案是对大型文件使用LOAD DATA INFILE
。您可能还需要disable keys,直到导入完成。