用range进行python循环需要注意的问题
用range进行python循环需要注意的问题2011-03-22 星期二 晴朗
今天将数据迁移脚步初步写好,输入是要迁移的记录id范围,比如[minId, maxId]。主函数体大概如下:# ?migrate the table range from [minId, maxId], with data patchdef migrate(tableName, minId, maxId):?? ?for id in range(minId, maxId):?? ??? ?migrate_one(id)
?? ?# now [minId, maxId] have been migrate, we should deal with the retry queue?? ?print "now begin to process the retry queue!"?? ?while retry_queue:?? ? ? ?id = retry_queue.pop()?? ? ? ?migrate_one(id)
一开始测试用小范围数据进行测试,没有问题。想测试一下性能,将范围设置为2亿,结果发现内存立刻飙升到100%,过了一会shell打印了一个killed process出来。纳闷了,因为我是很小心的使用内存的,包括数据库连接,自己搞了个连接池控制,一条记录一条记录的读取的,cursor也有注意关闭。没理由内存溢出啊。将代码认真检查了一下,发现了这一行代码有最大的嫌疑:for id in range(minId, maxId):查看了一下API,发现是range(..)是生成一个List对象,当这个范围很大的时候,比如我们上面的例子2亿,4G的内存必然溢出。
写的时候都是边查文档边写的,一知半解是很可怕的,在使用一个API或者语法的时候,还是要先仔细学习一下的。