Назад | Перейти на главную страницу

Ошибка MySQL при большой загрузке данных

Я использую скрипт python с библиотекой python MySQLdb для загрузки большого количества данных в локальную базу данных MySQL. Когда я использовал образец данных, все прошло нормально и было загружено. Теперь я использую все свои данные (это примерно 300000 строк, разделенных на 12000 текстовых файлов), и получаю следующую ошибку:

"OperationalError: (2003, ""Can't connect to MySQL server on 'localhost' (10055)"")"    

В момент сбоя он загрузил 17231 строку информации. Я использую Python 2.7, Win7 64 и MySQL 5.1.53 на настольном компьютере. Я использовал установку WAMP и просматривал данные с помощью PhpMyAdmin. Пример функции, которую я использую для загрузки данных, выглядит следующим образом:

# upload data
def updateDB(db, table, values):

    db = MySQLdb.connect (host = 'localhost', user = 'root', passwd = '', db = db)
    cursor = db.cursor()
    print str(values)
    cursor.execute(makeSQLHeader(table, values), values)     
    db.commit()
    db.close()

Это отлично работает для тестовых данных, и структура текстового файла идентична для всех моих данных. Что было бы хорошей стратегией для решения этой проблемы?

Мои две мысли по этому поводу заключаются в том, что либо загрузка занимает много времени, либо вы отключаетесь с таймаутом. Есть несколько способов автопереключения в python найдено здесь Вот соответствующие переменные тайм-аута в mysql: wait_timeout и Interactive_timeout

Вторая идея, и из обсуждения в комментариях она кажется правильной. Вы, вероятно, попали в соединение mysql ограничение, открывая соединение для каждого файла.

Попробуйте открыть одно соединение и запустить тест (когда вы это сделаете, вы можете достичь таймаута, в зависимости от того, сколько времени это займет).

Возможно, вы столкнулись с ограничениями максимально разрешенных пакетов. Вы можете установить что-то вроде этого в my.cnf:

max_allowed_packet=12M

Для получения дополнительной информации см. Эта статья в справочном руководстве по MySQL.