用range进行python循环需要注意的问题

用range进行python循环需要注意的问题

2011-03-22 星期二 晴朗

今天将数据迁移脚步初步写好,输入是要迁移的记录id范围,比如[minId, maxId]。主函数体大概如下:
#  migrate the table range from [minId, maxId], with data patch
def 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或者语法的时候,还是要先仔细学习一下的。

你可能感兴趣的:(python)