Вставьте большой текстовый файл в MySQL, используя Python - PullRequest
0 голосов
/ 07 июля 2019

У меня большой текстовый файл, который содержит данные, разделенные запятыми. Но внутри файла есть несколько блоков данных, разделенных тегами и. Мне нужно вставить эти куски в разные таблицы в MySQL.

Я читаю файл построчно. Когда найдено, я «создаю, если не существует» новую таблицу и начинаю вставлять построчно.

Но это занимает много времени, так как файл имеет около 1М строк.

Есть ли лучший способ ускорить процесс вставки?

Ниже приведен код, который я использую

    with open(file_name_with_path) as csv_file:
    csv_reader = csv.reader(csv_file,delimiter=',')
    line_count = 0
    start_count = 0
    new_file = False
    file_end = False
    ignore_line = False
    record_list = []
    file_name = ''

    temp_data = []

    for row in csv_reader:
        ignore_line = False
        if row[0].find('<START>') ==0:
            file_name = row[1]
            line_count = 0
            new_file = True
            ignore_line = True
        if row[0].find('<END>') == 0:
            file_end = True
            record_list.append(file_name + '_' + str(line_count))
            line_count = 0
            ignore_line = True
            print('End of a file.')
        if new_file == True:
            print('Start of a new file.')
            new_file = False
        if line_count == 0 and ignore_line is False and new_file is False:
            line_count += 1
            create_table(file_name,row)
            temp_data.append(row)
        elif ignore_line == False:
            line_count += 1
            add_data(file_name, row)
            temp_data.append(row)
    print(f'Processed the file - {",".join(record_list)}' )

Пример текстового файла.

<START> File1
col1,col2,col3
1,A,B 
2,C,D
<END>
<START> File2
col1,col2,col3,col4,col5
1,A,B,1,2 
2,C,D,3,4
<END>

1 Ответ

0 голосов
/ 07 июля 2019

Вы не показали нам код, который запускаете.

Вы предположили, что с оптимизмом вы получаете пропускную способность на уровне приложения около 40 строк / сек (50k / 1200), которую мывсе согласны "низко".Вы сможете легко добиться повышения производительности на один или два порядка.

Непонятно, используете ли вы локальный или удаленный экземпляр.Возможно, вы делаете 40 коммитов в секунду на локальный диск.Или, возможно, вы управляете 40 сообщениями в обе стороны по глобальной сети в секунду.

То, что вы хотите использовать, - это .executemany() с размером пакета около десяти тысяч строк, вставляемых в COMMIT.Это будет около ста COMMIT для ваших миллионов строк.

Многочисленные примеры доступны в Интернете, например https://pynative.com/python-mysql-insert-data-into-database-table/

...