为何tracemalloc输出的内存占用远小于10.6MB的JSON文件大小?
为什么tracemalloc统计的内存远小于JSON文件实际大小?
主要有两个核心原因:
1. 函数返回对象未被保留,已被垃圾回收
你的代码中asyncio.run(test())执行完毕后,test()返回的row对象没有被赋值给任何变量,Python的垃圾回收机制会立即回收这个大对象占用的内存。而你是在asyncio.run()之后才调用snapshot = tracemalloc.take_snapshot(),此时这部分内存已经被释放,自然不会被统计到。
2. Python对象与JSON文本的内存存储效率差异
即使对象没被回收,Python对象的内存占用也不等于JSON文件的大小:
- JSON是纯文本格式,包含大量冗余的语法字符(比如引号、逗号、大括号),这些在转成Python的
dict/list等数据结构后会被移除,只保留实际数据。 - Python会对内部对象进行内存优化,比如重复的字符串键会被复用(字典中相同的键只存储一次字符串对象,其余为引用),小整数对象会被缓存,这些都能大幅降低内存占用。
验证方法
如果要准确统计加载JSON后的内存占用,需要保留对象引用,调整代码如下:
import asyncio import aiofiles from ast import literal_eval import tracemalloc async def test(): async with aiofiles.open('somefile.json',"r") as f: line = await f.readline() row = literal_eval(line) return row tracemalloc.start() # 保留返回的对象,避免被GC回收 row = asyncio.run(test()) snapshot = tracemalloc.take_snapshot() top_stats = snapshot.statistics('lineno') total = sum(stat.size for stat in top_stats) print("Total allocated size: %.1f KiB" % (total / 1024)) # 手动保留对象,直到快照完成 del row
这样修改后,统计结果会更接近实际加载JSON对象后的内存占用(但依然可能略小于文件大小,因为Python对象的存储效率更高)。
内容的提问来源于stack exchange,提问作者tohardtme
相关产品推荐
相关产品推荐

