在Python中优化内存使用:使用del obj还是gc.collect()?

2 投票
1 回答
936 浏览
提问于 2025-04-18 03:13

我有一个Python脚本,用来分析日志文件中的用户行为。

这个脚本会从几个很大的文件(每个大约50GB)中读取数据,使用file.readlines()方法,然后逐行分析这些数据,最后把结果保存在一个Python对象的字典里。等所有行都分析完后,这个字典会被写入磁盘。

因为我有一台服务器,配备了64个核心和96GB内存,所以我启动了10个这个脚本的进程,每个进程处理一部分数据。此外,为了节省输入输出操作的时间,我使用file.readlines(MAX_READ_LIMIT)而不是file.readline(),并把MAX_READ_LIMIT设置为1GB。

在服务器上运行这个脚本时,我使用top命令查看任务资源,发现虽然每个进程大约只占用3.5GB内存(总共40GB),但服务器上只剩下380MB的内存(同时没有其他占用内存的应用在运行)。

所以,我在想内存到底去哪儿了?应该还有大约96-40=36GB的内存剩下吧?

请告诉我我在上述观察中是否有错误。

我猜测未使用的内存并没有立即放回内存池,所以我在想如何明确和立即释放未使用的内存

我从Python文档中了解到,Python有两种互补的方法来管理内存:垃圾回收和引用计数。根据Python文档:

因为垃圾回收补充了Python中已经使用的引用计数,如果你确定你的程序不会产生引用循环,可以禁用垃圾回收。

那么,在我的情况下,我应该使用del obj还是gc.collect()呢?

1 个回答

3

使用 file.readlines(),然后逐行分析数据

这个设计不好。readlines 会把整个文件读进来,并返回一个包含字符串的列表。如果你只需要逐行处理数据,那就直接遍历文件,不用 readlines

with open(filename) as f:
    for line in f:
        # process line

这样可以大大减少你的程序所需的内存。

撰写回答