作者yungyuc (酷狗喵千代)
看板Python
标题Re: [问题] 请问为何我这程式会吃掉过多记忆体?
时间Sun Feb 8 08:18:31 2009
※ 引述《sbrhsieh (sbr)》之铭言:
: ※ 引述《Kuster (克斯特)》之铭言:
: : 大家好,想请教一个问题,我这段程式为何会在执行的时候
: : 随着执行过程记忆体不断消耗掉?
: : index = [None] * 4896990
: : data = [None] * 71242183
: : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^我先宣告固定大小的List
: : 这时候记忆体大约吃了500MB
: : print raw_input('ok1:')
: : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^我程式在这边暂停,我确定到此记忆体只吃500MB
: : current = 1
: : index[0] = 0
: : for line in open('SLo.txt'):
: : line = line.rstrip()
: : data1 = [int(i) for i in line.split()]
: : l = len(data1) - 1
: : index[current] = index[current-1] + l
: : data[index[current-1]:index[current]] = data1[1:]
: : current +=1
: : 接着在跑回圈的时候记忆体不断消耗,程式执行过程中多吃掉了1G以上
: : 我的SLo.txt这档案相当大是没错,可是使用for回圈来直接读取档案
: : 会循序读取档案,并不会将档案内容直接载入到记忆体阿?
: : 接着我直接指定一段data的范围,将data1的内容直接覆盖过去
: : 这样也不会消耗掉记忆体阿?
: : 请问到底是哪个部份在消耗记忆体呢?
: : 谢谢各位前辈!!
: 一个 list cell 占用 4 bytes 是用来存放 reference/pointer/address value
: index = [None] * 4896990
: index 指涉的 list object 至少会占用 4 * 4896990 bytes。
: 而
: index[0] = 5
: 此 statement 并不是把数值 5 写进 index[0],是产生一个值为 5 的 int
: object(如果有需要),把该 object 的 addess/reference 写进 index[0]。
: 也就是说如果程式一开始建立一个 list object:
: a = [None] * 1024
: 这个 list object 至少占 4k bytes,
: for x in xrange(len(a)):
: a[x] = int(x)
: 会再用掉至少 4k bytes(假设一个 int object 成本至少 4 bytes) for 1024
: 个 int object。
如果是 64 bits Python 的话,一个 int 是 8 bytes
Kruster 可以试试看用 data = [0]*blah,或许记忆体一开始就会吃全部了
另外,对这种资料档,请爱用 numpy:
http://tinyurl.com/bqq2mt
自己写 reader 简直是找麻烦 :p
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 76.181.246.83
1F:推 ykjiang:原 PO 可以简单讲一下他的用途及档案格式吗? 02/08 14:04