我有一个python脚本来分析日志文件中的用户行为。
这个脚本使用file.readlines()从几个大文件(每个大约50 GB)中读取,然后逐行分析它们并将结果保存在python对象的dict中,在分析完所有行之后,dict写入磁盘。
由于我有一个具有64个内核和96 GB内存的服务器,我启动了此脚本的10个进程,每个进程处理部分数据。此外,为了节省IO操作所花费的时间,我使用file.readlines(MAX_READ_LIMIT)而不是file.readline()并设置MAX_READ_LIMIT = 1 GB。
在使用top命令显示任务资源的同时在服务器上运行此脚本后,我发现虽然我的脚本的每个进程只占用大约3.5 GB的内存(总共40 GB),但是只剩下380 MB服务器(服务器上没有同时运行其他重要的内存消耗应用程序。)
所以,我想知道内存在哪里?应该留下大约96-40 = 36GB的内存?
如果我在上述观察中犯了一些错误,请告诉我。
一个假设是未使用的内存不会立即放回内存池中,所以我想知道如何明确地立即释放未使用的内存。
我从python文档中了解到在python中管理内存有两种互补的方法:垃圾收集和引用计数,并根据python doc:
由于收集器补充了已经使用的引用计数 Python,如果你确定你的程序,你可以禁用收集器 不会创建参考周期。
那么,我应该使用哪一个,del obj或gc.collect()?
答案 0 :(得分:3)
使用file.readlines(),然后逐行分析数据
这是一个糟糕的设计。 readlines
读取整个文件并返回Python字符串列表。如果您只需要逐行处理数据,则在不使用readlines
的情况下遍历文件:
with open(filename) as f:
for line in f:
# process line
这将大大减少程序所需的内存量。