You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:32:25