python的类怎么释放_如何在Python中打开文件后释放内存

这对我来说也毫无意义,我想弄清楚这是怎么发生的。(我也这么认为!)我把它复制到了我的机器上——不过用的是一个小文件。

我在这里看到两个离散的问题为什么Python要将文件读入内存(使用惰性行读取,它不应该是正确的?)

为什么Python不向系统释放内存

我根本不懂Python内部的知识,所以我只是做了大量的web搜索。所有这些都可能完全偏离目标。(我几乎不再发展,在过去的几年里一直在科技行业工作)

懒线阅读

我环顾四周发现了这个帖子-

这是一个更早版本的python,但这句话引起了我的共鸣:readlines() reads in the whole file at once and splits it by line.

然后我看到了这个,同样古老的,effbot帖子:

关键是:For example, if you have enough memory, you can slurp the entire file into memory, using the readlines method.

而这个:In Python 2.2 and later, you can loop over the file object itself. This works pretty much like readlines(N) under the covers, but looks much betterThis method returns the same thing as iter(f)

Deprecated since version 2.3: Use for line in file instead.

这让我觉得也许有人在说粗话。Read until EOF using readline() and return a list containing the lines thus read.

好像就是这样。Read one entire line from the file

所以我试着把它切换到readline,进程从来没有超过40MB(之前它已经增长到200MB,日志文件的大小)accounts = dict()

data= open(filename)

for line in data.readline():

info = line.split("LOG:")

if len(info) == 2 :

( a , b ) = info

try:

accounts[a].add(True)

except KeyError:

accounts[a] = set()

accounts[a].add(True)

我的猜测是,我们并不是真的在偷懒地阅读带有for x in data结构的文件——尽管所有的文档和stackoverflow注释都表明我们是。readline()对我来说消耗的内存少得多,realdlines消耗的内存量与for line in data差不多

释放记忆

在释放内存方面,我对Python的内部结构不太熟悉,但我回想起来,在使用mod_perl时。。。如果我打开一个500MB的文件,那么这个apache子文件就会增长到这个大小。如果我释放了内存,它将只在那个子内存中是空闲的——垃圾收集的内存在进程退出之前不会返回给操作系统。

所以我仔细研究了一下这个想法,发现了一些链接,暗示这可能正在发生:If you create a large object and delete it again, Python has probably released the memory, but the memory allocators involved don’t necessarily return the memory to the operating system, so it may look as if the Python process uses a lot more virtual memory than it actually uses.

那有点旧了,后来我在python中发现了一堆随机(可接受的)补丁,这些补丁表明行为发生了变化,现在可以将内存返回到os(截至2005年,大多数补丁都已提交并得到了批准)。"""- Patch #1123430: Python's small-object allocator now returns an arena to the system free() when all memory within an arena becomes unused again. Prior to Python 2.5, arenas (256KB chunks of memory) were never freed. Some applications will see a drop in virtual memory size now, especially long-running applications that, from time to time, temporarily use a large number of small objects. Note that when Python returns an arena to the platform C's free(), there's no guarantee that the platform C library will in turn return that memory to the operating system. The effect of the patch is to stop making that impossible, and in tests it appears to be effective at least on Microsoft C and gcc-based systems. Thanks to Evan Jones for hard work and patience.

因此,在linux下使用2.4(正如您所测试的那样),您确实不会总是得到

对于许多小对象来说

收集。

因此(我想)你看到的f.read()和

readlines()是前者将整个文件作为一个大的

字符串对象(即不是小对象),后者返回一个列表

每行都是python对象的行数。

如果“for line in data:”构造实际上是包装readlines,而不是包装readline,那么这可能与它有关?也许拥有一个3GB的对象不是问题,而是拥有数百万个30k的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值