Пошаговый просмотр файла CSV в Python - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь ускорить загрузку большого файла 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?

Ответы [ 2 ]

1 голос
/ 06 мая 2019

Если вам нужны высокоскоростные вставки в MySQL, вы можете попробовать использовать:

LOAD DATA LOCAL INFILE '/path/to/my_file.csv' INTO TABLE my_table;

0 голосов
/ 06 мая 2019

Небольшой намек:

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 для больших файлов. Вам также может понадобиться отключить ключи до завершения импорта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...