python逐条修改mysql_用Python逐行处理非常大的900M行MySQL表

在处理包含900M行的大型MySQL表时,使用Python和sqlalchemy遇到连接丢失错误。脚本利用SSCursor处理消息字段的语言分类,但执行过程中断。尝试增加max_allowed_packet大小并未解决问题。寻求修复该错误或更健壮处理大型MySQL文件的建议。
摘要由CSDN通过智能技术生成

我经常需要使用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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值