作者yauhh (哟)
看板Python
标题[问题] 回圈中想用gc处理记忆体
时间Wed May 21 02:33:09 2014
嗨,新手到此拜会.
想问个问题,我有个工作需要用回圈读大量资料.
我想,假如在回圈中指定了很多区域变数,这些变数空间在下一圈都直接抛弃掉吗?
或者,我是否该在回圈跑到一个数量的圈数,就开一次gc?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 118.167.145.113
※ 文章网址: http://webptt.com/cn.aspx?n=bbs/Python/M.1400610793.A.346.html
1F:→ apua:like this? ``for i in [1,2]: a=1`` 05/21 14:31
2F:→ yauhh:Yes. Many variables local to for loop. 05/21 17:24
3F:→ grtfor:没记错的话,python 的gc call了,也不会马上回收 05/21 23:32
4F:推 ya790206:在 python,每次呼叫 gc.collect() 都会真的跑一次 05/22 23:00
5F:→ ya790206:garbage collect。详见CPython 原始码Modules/gcmodule.c 05/22 23:01
6F:→ ya790206:的 gc_collect function 。 05/22 23:02
7F:→ ya790206:这里说的是官方网站以c语言写的直译器,其他的我不知道 05/22 23:03
8F:→ yauhh:那假如不用gc,回圈中的变数会累积吗? 05/23 12:09
9F:推 ya790206:如果你的"不用gc"的意思是指gc.disable()来停用 gc 的话 05/23 22:28
10F:→ ya790206:那麽你所产生的物件都不会被删除。如果你"不用gc"指不 05/23 22:28
11F:→ ya790206:呼叫gc.collect() ,则系统会在必要时自动呼叫 05/23 22:29
12F:→ ya790206:gc.collect()。你不必刻意去呼叫他(除非你知道你在干嘛) 05/23 22:29
13F:→ ya790206:一直呼叫gc.collect()不会出事,只是一直再做没意义的事 05/23 22:31
14F:→ ya790206:而已 05/23 22:31
15F:→ yauhh:唉,我真正在问的问题是回圈中的变数所占的记忆体空间,但你却 05/23 23:03
16F:→ yauhh:只在gc那边绕. gc我知道啦,如果我想用就会用,但要用也要用在 05/23 23:04
17F:→ yauhh:适当的情况. 而我的问题就是在询问/寻找那个适当的情况而已. 05/23 23:05
18F:→ yauhh:不要继续在gc绕了. 我没问gc的问题. 05/23 23:05
先为我问了问题之後,再嫌答题答案的动作致歉。但我很直接的想法是:假如你不知道
我问的是什麽,并且不知道其实你没有回答到我的问题,那我真想要的答案就不会出现。
别人会以为,我真的再问gc怎麽用。
我的问题缘起是,我有一批现有XML资料要处理,并且未来有更多XML资料。
由於每个XML都小,但是XML档的数量很多,所以我的程式显然是一个回圈,每一圈里头
都有各自独立的档案读取、解码转换为CSV的动作,而且是在一圈中就跑出好几个XML或
CSV的物件。
这个程式,虽然我还没写,但是我可以先评估程式的结构、效能,资源的使用与浪费。
因此,询问「回圈使用gc」的问题,其实是要等熟悉python VM的人回答一些底层机制
的因素,像是回圈中的变数,有没有根据dependency来决定要不要启动gc。我评估回圈
中的变数是否累积,用意是要考量是否需要为了这一点写容错的程式。
虽然你很用功看了python的源码有关gc.collect()的那一行,但是,你的讨论似乎谈到
一个很小的层面,你只用gc.collect()这一段程式,就想要说明python整个系统gc机制,
这样有意义吗?我倒觉得,不要浪费时间,如果能有精力看VM源码,来bbs回答一个很小
的重点,实在是糟蹋。
※ 编辑: yauhh (118.167.144.208), 05/23/2014 23:48:54
19F:→ ya790206:我去年就已经看完 python gc 演算法和 vm 如何执行程式码 05/24 11:03
20F:→ ya790206:并不是为了回答你问题而去看程式码。 05/24 11:04
21F:推 timTan:再问清楚一点就好,何必讲些失焦的话 05/24 18:23