Re: [問題] 請問為何我這程式會吃掉過多記憶體?

看板Python作者 (酷狗喵千代)時間16年前 (2009/02/08 08:18), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串3/5 (看更多)
※ 引述《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

02/08 14:04, , 1F
原 PO 可以簡單講一下他的用途及檔案格式嗎?
02/08 14:04, 1F
文章代碼(AID): #19ZYJOLw (Python)
文章代碼(AID): #19ZYJOLw (Python)