У меня есть несколько файлов, которые нужно проанализировать и вставить в таблицу. Вот рассматриваемая таблица:
Размер этого файла составляет 20,4 МБ, в нем 81963 строки. Есть файлы большего размера (до 40.xMB). Вот что я делаю:
self.ingester.cursor.execute('''
insert into microsoft_products (bigid_sku, md5_hexdigest, content_type, locale)
values (\'{}\', \'{}\', \'{}\', \'{}\')
'''.format(BigId_Sku, md5_hexdigest, content_type, locale))
Вот прошедшее время из нескольких строк:
line: 6400 | elapsed time: 519.91
line: 6401 | elapsed time: 519.99
line: 6402 | elapsed time: 520.07
line: 6403 | elapsed time: 520.16
line: 6404 | elapsed time: 520.24
line: 6405 | elapsed time: 520.32
После комментирования оператора вставки:
line: 6400 | elapsed time: 0.81
line: 6401 | elapsed time: 0.81
line: 6402 | elapsed time: 0.81
line: 6403 | elapsed time: 0.81
line: 6404 | elapsed time: 0.81
line: 6405 | elapsed time: 0.81
Поток управления выглядит так:
for file in files:
open file
for line in file:
do stuff
execute insert
commit
Я очень наивен, когда дело касается базы данных. Есть ли способ ускорить это?
У вас есть пример этого или статья, на которую вы могли бы дать мне ссылку?






В соответствии с предложением @FrankerZ вы можете вставлять партии.
При просмотре строк в файле сгенерируйте свои значения для пакетной вставки.
Пакетная вставка SQL по существу выглядит следующим образом:
INSERT INTO table (col1, col2) VALUES (r1c1, r1c2), (r2c1, r2c2)...
Где r = row и c = col.
В зависимости от количества данных, которые вы вставляете за один раз, вам может потребоваться увеличить глобальную переменную max_allowed_packet.
Вставки в базу данных обычно удобны и быстры, поэтому ваше узкое место заключается в том, что вы выполняете вставку для каждой строки, поэтому +1 для предложения @FrankerZ.
Вставляйте партиями. Вместо того, чтобы вставлять в базу данных по одной строке, обрабатывайте 100 за раз.