python - Python/JSON 加载的对象大小因文件大小而异
问题描述
最近,我有一个文件中的数据,users.json
由于文件太大(让我感到惊讶,因为它是一个29mb
文件),所以在 VsCode 中加载需要很长时间,我想借此机会玩一下 python 的内存使用情况,我将文件全部加载到内存中,它按预期工作。
虽然我有一个问题,但我更需要解释,如果它的答案太明显,请原谅我;
当我对加载的
json
对象进行自省时,我发现对象大小 (1.3mb
) 远小于29.6mb
我的文件系统 ( ) 上的文件大小 (MacOS
),这是怎么回事?大小上的差异实在是太大了,不容忽视。更糟糕的是,我有一个较小的文件,并且该文件返回了相似大小的结果(在磁盘上/已加载,~358kb
),哈哈。
import json
with open('users.json') as infile:
data = json.load(infile)
print(f'Object Item Count: {len(data):,} items \nObject Size: {data.__sizeof__():,} bytes)
使用sys.getsizeof(data)
会返回类似的东西,可能会有一些gc
开销。
这将返回磁盘上文件的准确大小(29586765
字节,29mb
)
from pathlib import Path
Path('users.json').stat().st_size
请有人向我解释发生了什么,有人会认为大小应该相似,或者我错了。
解决方案
sys.getsizeof()
不递归到对象:
仅考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗。
从您的 JSON 文件中加载的所有字符串、数字等都是上述“被引用的对象”。
为了获得更准确的结果,您可以
- 测量您的 Python 进程在加载前后的内存使用情况(例如https://stackoverflow.com/a/21632554/51685)
- 使用内存分析器(例如,推荐使用哪个 Python 内存分析器?)
尽管如此,一些对象在内存中会比在磁盘上小;例如,一个很大的数,比如说,36 << 921
在磁盘上是 279 字节,sys.getsizeof()
在内存中固定为 148 字节。同样,一个足够智能的 JSON 解码器(其中,afaik ,内置默认 JSON 解码器实际执行的操作,请参阅https://github.com/python/cpython/commit/7d6e076f6d8dd48cfd748b02dad17dbeb0b346a3)可以共享对象以重复 dict 键。json
不是
推荐阅读
- r - 将数据点与 ggplot2 相关联
- android - Android Kotlin - 处理多个客户端的套接字服务器
- python - 错误:3D Matlab 数组到 0 维 np 数组
- php - 尝试通过 ActiveCampain API (Laravel) 添加联系人
- php - laravel 中的 PDO 在返回后不会进入下一个循环
- python - Python 到 VB.NET - 使用 Tor 检查 URL
- laravel - Lighthouse 根据其他属性值更改字段值
- powerapps - 从填充了来自共享点的项目的组合框中提取数据
- python - 如何将 django 模型保存到数据库?save() 方法不起作用
- haskell - 使用“Haskell Tool Stack”在哪里准确设置要导入的模块的依赖项?