关于python:我的列表使用了多少内存?

How much memory does my list use?

本问题已经有最佳答案,请猛点这里访问。

我正在通过以下方式将HDF5数据集读取到内存中:

1
2
3
import h5py
with h5py.File('file.hdf5') as f:
    a = f['data'][:]

其中"A"最多可以有1亿个实体。如何准确查询此列表占用的内存(MB/GB)?


h5py将(大多数)值作为numpy数组加载。数组具有shape属性和dtype属性。

对于我在ipython会话中碰巧拥有的数组,我可以获得以下属性:

1
2
3
4
5
6
7
8
9
10
11
In [211]: X.shape,X.dtype
Out[211]: ((51, 13), dtype('float64'))

In [212]: X.size
Out[212]: 663

In [213]: X.size, X.itemsize
Out[213]: (663, 8)

In [214]: X.nbytes
Out[214]: 5304

ipython whos命令还提供了以下信息:

1
X   ndarray       51x13: 663 elems, type `float64`, 5304 bytes

X也使用一些内存来存储这样的属性,但大多数内存使用的是数据缓冲区,在本例中,数据缓冲区的长度为5304字节。

h5py可能有一些附加信息,我得检查一下文件。但这些都是numpy的基础。

在h5py文档中,我看到一个数据集有形状、大小和数据类型。我看不到nbytes或itemsize。你可能得推断一下。

对于一个小的示例文件,我得到(在IPython会话中)

1
2
3
In [262]: y
Out[262]: <HDF5 dataset"y": shape (10,), type"<i4">
In [265]: y1=f['y'][:]

以及whos条目:

1
2
y             Dataset     <HDF5 dataset"y": shape (10,), type"<i4">
y1            ndarray     10: 10 elems, type `int32`, 40 bytes

y1是一个ndarray,具有我描述的所有属性。y,空载,没有nbytes,但可以根据形状和数据类型计算。