Python Mysql executemany оператор обновления замедляется / приложение останавливается - PullRequest
0 голосов
/ 10 июля 2019

Я анализирую текстовый файл и затем обновляю столбец таблицы mysql значениями, проанализированными из файла на основе первичного ключа в этой таблице.Сначала я использовал sqlite для этого и писал в локальный файл sqlite, где я не столкнулся с какими-либо проблемами.Сейчас я пишу в новую базу данных mysql, и при использовании executemany для обновления таблицы с большими списками, анализируемыми из текстового файла, обновления занимают много времени, иногда 20-30 секунд, а в некоторых случаях, когда список содержит ~ 50 тыс. Записей, приложениеникогда ничего не пишет успешно.

Я пытался использовать executemany, так как при использовании sqlite это, казалось, уменьшило проблемы с производительностью, код перестанет работать, когда в вызове executemany будет использован достаточно большой список.Из того, что я прочитал, я должен использовать executemany с INSERT и ON DUPLICATE KEY UPDATE, но это приводит к усеченной ошибке данных.

def strip_file(x):
        filePath = 'somefile.txt'
        with open(filePath) as file:
                        for i, line in enumerate(file):
                                if i > x:
                                        indicatorName = re.findall(re.escape('some text')+"(.*?)"+re.escape("blah"),line)
                                        if indicatorName:
                                                indicatorCount = re.findall(re.escape('number')+"(.*?)"+re.escape("|"),line)
                                                indicatorTime = re.findall(re.escape('time')+"(.*?)"+re.escape('end'),line)
                                                for i in indicatorTime:
                                                        i.strip()

                                                indicatorName = re.findall(re.escape('ending' + indicatorCount[0] +'|')+"(.*?)"+re.escape('|'),line)
                                                indicatorNameInd = indicatorName[0].split(",")
                                                indicatorNameInd = filter(None, indicatorNameInd)
                                                for i in indicatorNameInd:
                                                        i.strip()
                                                indicatorTimeSeq = [indicatorTime]*len(indicatorNameInd)
                                                indicatorTimeList = list(chain(*indicatorTimeSeq))


                                                indicatorSeq = zip(indicatorTimeList, indicatorNameInd)




                                                cursor.execute('SET autocommit=0')
                                                sql = 'UPDATE IndicatorData SET IndicatorTime=%s WHERE IndicatorID=%s'
                                                cursor.executemany(sql, indicatorSeq)
                                                conn.commit()

Этот подход прекратит запись, если индикатор seq велик.

Использование INSERT ON DUPLICATE KEY UPDATE:

                                   sql = 'INSERT INTO IndicatorData (IndID, IndTime) VALUES (%s,%s) ON DUPLICATE KEY UPDATE VALUES IndTime = %s'
                                        cursor.executemany(sql, indicatorSeq)

Я ожидаю обновления IndTime в таблице, если в столбце IndID присутствует индикатор IndicatorID, связанный с этим списком.Вместо этого я получаю эту ошибку:

ProgrammingError: Ошибка обработки параметров формата;Python 'кортеж' не может быть преобразован в тип MySQL

...