Python MySQL запрос не завершен - PullRequest
1 голос
/ 18 февраля 2010

У меня проблемы со скриптом Python, который просто анализирует файл CSV построчно, а затем вставляет каждую строку в таблицу MySQL с помощью цикла FOR:

f = csv.reader(open(filePath, "r"))
i = 1
for line in f:
    if (i > skipLines):
        vals = nullify(line)
        try:
            cursor.execute(query, vals)
        except TypeError:
            sys.exc_clear()
    i += 1
return

Где запрос имеет форму:

query = ("insert into %s" % tableName) + (" values (%s)" % placeholders)

Это прекрасно работает с каждым файлом, для которого он используется, за одним исключением - самым большим файлом. Каждый раз он останавливается в разных точках - иногда он достигает 600 000 записей, иногда 900 000. Но в общей сложности около 4 000 000 записей.

Я не могу понять, почему он это делает. Тип таблицы - MyISAM. Много свободного места на диске. Таблица достигает около 35 МБ, когда она останавливается. max_allowed_packet установлен на 16 МБ, но я не думаю, что это проблема, поскольку он выполняется построчно?

У кого-нибудь есть идеи, что это может быть? Не уверен, что за это отвечает Python, MySQL или модуль MySQLdb.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 18 февраля 2010

Вы пробовали LOAD Функция MySQL?

query = "LOAD DATA INFILE '/path/to/file' INTO TABLE atable FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\\\'"
cursor.execute( query )

Вы всегда можете предварительно обработать файл CSV (по крайней мере, это то, что я делаю:)

Еще одна вещь, которую стоит попробовать, это массовые вставки. Вы можете попробовать вставить несколько строк одним запросом:

INSERT INTO x (a,b)
VALUES 
('1', 'one'),
('2', 'two'),  
('3', 'three')

О да, и вам не нужно совершать коммиты, так как это движок MyISAM.

0 голосов
/ 18 февраля 2010

Как говорил С. Лотт, не используются ли курсоры в качестве дескрипторов в транзакциях?

Так что в любое время БД дает вам возможность откатить все эти ожидающие вставки.

Вы можете просто иметь слишком много вставок для одной транзакции. Попробуйте совершать транзакцию каждые пару тысяч вставок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...