Я пытаюсь ускорить загрузку большого файла CSV в базу данных MySQL. При использовании этого кода загрузка файла объемом 4 ГБ занимает около 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 для использования в операторе диапазона.
Как я могу выполнить цикл по 1000 строкам файла CSV за раз и сохранить результат в списке, использовать его в executemany, затем сохранить следующие 1000 строк и т. Д. До конца файла CSV?