Обновление одной таблицы MYSQL с несколькими процессами через pymysql - PullRequest
0 голосов
/ 28 декабря 2018

На самом деле, я пытаюсь обновить одну таблицу с несколькими процессами через pymysql, и каждый процесс читает CSV-файл, отделенный от огромного, чтобы повысить скорость.Но я получаю Lock wait timeout exceeded; try restarting transaction exception, когда запускаю скрипт.После поиска постов на этом сайте я обнаружил один пост, в котором упоминалось, что для установки или сборки встроенного LOAD_DATA_INFILE нет подробностей.Как я могу сделать это с помощью 'pymysql', чтобы достичь своей цели?

--------------------------- first edit----------------------------------------

Вот метод работы:

`def importprogram(path, name):
    begin = time.time()
    print('begin to import program' + name + ' info.')
    # "c:\\sometest.csv"
    file = open(path, mode='rb')
    csvfile = csv.reader(codecs.iterdecode(file, 'utf-8'))

    connection = None
    try:
        connection = pymysql.connect(host='a host', user='someuser', password='somepsd', db='mydb',
                                 cursorclass=pymysql.cursors.DictCursor)
        count = 1
        with connection.cursor() as cursor:
            sql = '''update sometable set Acolumn='{guid}' where someid='{pid}';'''
            next(csvfile, None)
            for line in csvfile:
                try:
                    count = count + 1
                    if ''.join(line).strip():
                        command = sql.format(guid=line[2], pid=line[1])
                        cursor.execute(command)
                    if count % 1000 == 0:
                        print('program' + name + ' cursor execute', count)
                except csv.Error:
                    print('program csv.Error:', count)
                    continue
                except IndexError:
                    print('program IndexError:', count)
                    continue
                except StopIteration:
                    break
    except Exception as e:
        print('program' + name, str(e))
    finally:
        connection.commit()
        connection.close()
        file.close()
    print('program' + name + ' info done.time cost:', time.time()-begin)`

И метод мульти-обработки:

import multiprocessing as mp
def multiproccess():
    pool = mp.Pool(3)
    results = []
    paths = ['C:\\testfile01.csv', 'C:\\testfile02.csv', 'C:\\testfile03.csv']
    name = 1
    for path in paths:
        results.append(pool.apply_async(importprogram, args=(path, str(name))))
        name = name + 1

    print(result.get() for result in results)
    pool.close()
    pool.join()

И основной метод:

if __name__ == '__main__':
    multiproccess()

Я новичок в Python.Как я могу сделать код или сам путь идет не так?Должен ли я использовать только один процесс для завершения чтения и импорта данных?

1 Ответ

0 голосов
/ 28 декабря 2018

Ваша проблема в том, что вы превышаете время, отведенное для получения ответа с сервера, поэтому клиент автоматически отключается.По моему опыту, настройте время ожидания примерно на 6000 секунд, объедините в один CSV и просто оставьте данные для импорта.Кроме того, я бы рекомендовал запускать запрос непосредственно из MySQL, а не из Python.

Обычно я импортирую данные CSV из Python в MySQL с помощью метода INSERT ... VALUES ..., и я делаю это только тогда, когда требуются какие-то манипуляции с данными (т.е. вставка различных строкв разные таблицы).

Мне нравится ваш подход и я понимаю ваше мышление, но на самом деле в этом нет необходимости.Преимущество метода INSERT ... VALUES ... заключается в том, что вы не столкнетесь с проблемой тайм-аута.

...