Python - 内存中对象的大小与磁盘上的大小

Posted

技术标签:

【中文标题】Python - 内存中对象的大小与磁盘上的大小【英文标题】:Python - size of object in memory vs. on disk 【发布时间】:2018-06-13 14:55:43 【问题描述】:

这是我的例子:

import numpy as np
test = [np.random.choice(range(1, 1000), 1000000) for el in range(1,1000)]

这个对象占用内存:

print(sys.getsizeof(test)/1024/1024/1024)
8.404254913330078e-06

大约 8 KB

当我将它写入磁盘时

import pickle
file_path = './test.pickle'
with open(file_path, 'wb') as f:
    pickle.dump(test, f)

ls -l 命令占用了将近 8GB 空间

有人能解释一下为什么它在内存中占用这么少空间而在磁盘上占用这么多空间吗?我猜记忆中的数字不准确。

【问题讨论】:

你觉得如何,10 亿个数字适合 8KB? 【参考方案1】:

我猜记忆中的数字不准确。

嗯,这不能解释 6 个数量级的大小,对吧? ;)

test 是 Python list 实例。 getsizeof 会告诉您“指针”的大小,在您的系统上它是 64 位以及其他一些属性。但是你需要做更多的事情来获取附加到这个实例的所有东西,检查每个元素(列表在 Python 中没有严格的类型,所以你不能简单地做size_of_element * len(list) 等)。

这里有一个资源:https://code.tutsplus.com/tutorials/understand-how-much-memory-your-python-objects-use--cms-25609

这是另一个:How do I determine the size of an object in Python?

【讨论】:

@StefanPochmann 嗯,是的,在 Python 中它有点复杂。对象是PyObjects,具有引用计数器和指向实际类型的类型,例如PyIntObject(结构子类型),它再次保存实际值和另一个引用计数等。所有这些都在链接页面或 Python 文档中得到了很好的解释。

以上是关于Python - 内存中对象的大小与磁盘上的大小的主要内容,如果未能解决你的问题,请参考以下文章

为啥报告的数据库大小(在磁盘上?)与内存中的不同

AudioKit/DSP:了解磁盘上未压缩音频的大小与内存中的差异

提前以编程方式确定文件“磁盘上的大小”

为啥 python pickle 加载和转储会膨胀磁盘上对象的大小?

VMware虚拟机Ubuntu里的文件空间占用有问题,请看截图。磁盘上的大小远远大​于文件总大小!!

java如何获取一个对象的大小