我经常需要使用Python逐行处理MySQL表的数亿行。我不需要被监控的脚本。
下面我粘贴了一个脚本,对行中的消息字段的语言进行分类。它利用了sqlalchemy和MySQLdb.cursors.SSCursor模块。不幸的是,在远程运行4840行和本地运行42000行之后,这个脚本总是抛出一个在查询期间丢失到MySQL服务器的连接的错误。
另外,我检查了MySQL服务器的/etc/MySQL上的max_allowed_packet=32M/我的.cnf根据此stackoverflow问题的答案进行归档Lost connection to MySQL server during query
如果您有任何建议,可以修复这个错误,或者使用另一种方法使用Python以健壮的方式处理非常大的MySQL文件,我们将不胜感激!import sqlalchemy
import MySQLdb.cursors
import langid
schema = "twitterstuff"
table = "messages_en" #900M row table
engine_url = "mysql://myserver/{}?charset=utf8mb4&read_default_file=~/.my.cnf".format(schema)
db_eng = sqlalchemy.create_engine(engine_url, connect_args={'cursorclass': MySQLdb.cursors.SSCursor} )
langid.set_languages(['fr', 'de'])
print "Executing input query..."
data_iter = db_eng.execute("SELECT message_id, message FROM {} WHERE langid_lang IS NULL LIMIT 10000".format(table))
def process(inp_iter):
for item in inp_iter:
item = dict(item)
(item['langid_lang'], item['langid_conf']) = langid.classify(item['message'])
yield item
def update_table(update_iter):
count = 0;
for item in update_iter:
count += 1;
if count%10 == 0:
print "{} rows processed".format(count)
lang = item['langid_lang']
conf = item['langid_conf']
message_id = item['message_id']
db_eng.execute("UPDATE {} SET langid_lang = '{}', langid_conf = {} WHERE message_id = {}".format(table, lang, conf, message_id))
data_iter_upd = process(data_iter)
print "Begin processing..."
update_table(data_iter_upd)