我希望使用中间的^{
$ python3 -V
Python 3.4.2
$ pip freeze | grep -E 'scipy|numpy'
numpy==1.14.2
scipy==1.0.1
numpy
当我构建一个20000×20000 numpy的16位整数数组时,我估计其大小将是20000**2*16/8/2**20≈763M。进程的驻留集大小(RSS)为815M,由htop
unix工具报告,这与我的估计相符。在
dict
当我使用16位整数作为键和值构建20000×20000scipy.sparse.dok_matrix
时,我估计大小将是20000**2*(16*3)/8/2**30≈2.24G加上哈希表的一些小开销。但是,这个过程的RSS为66.4G,这表明我在估计中犯了一个严重的错误。在
import numpy as np
n = 20000
M = dict()
for i in range(n):
i = np.uint16(i)
for j in range(n):
j = np.uint16(j)
M[(i, j)] = np.uint16(1)
scipy.sparse.dok_matrix
当我使用16位整数作为键和值构建一个20000×20000scipy.sparse.dok_matrix
时,我估计大小再次是20000**2*(16*3)/8/2**30≈2.24G加上哈希表的一些小开销。但是,这个过程的RSS为81.3G,这比dict
示例的RSS还要远。在
from scipy.sparse import dok_matrix
import numpy as np
n = 20000
M = dok_matrix((n, n), dtype=np.uint16)
for i in range(n):
i = np.uint16(i)
for j in range(n):
j = np.uint16(j)
M[i, j] = 1
虽然您可以控制
data
的data
的dtype
,但不能控制密钥存储。在查看
dok_matrix
类代码:因此,这些元素存储为选定的
^{pr2}$dtype
的numpy“scalar”对象:我对Python dict存储了解不够,无法估计哈希表所需的内存。我不认为实际的索引元组存储在任何地方,只是它们的哈希值。在
最近的另一个问题试图使用
sys.getsizeof
比较数组和列表的内存使用情况。在这件事上:对于列表,
getsizeof
只捕获对象开销和指针缓冲区。我不知道字典能捕捉到什么。也许只是哈希表。数据值存储在内存的其他位置:其他稀疏格式的存储更容易估计。}使用3个numpy数组。根据矩阵的维数,索引数组存储为}。在
coo
和{int32
或{为了粗略估计内存使用情况,我编写了各种格式的文件:
由于}中的每一个都有一个100元素数组。
M
已满,因此稀疏coo
格式将占用密集数组的3倍空间。coo
为data
、row
和{csr
试图压缩row
数组,但差别并不总是那么显著。在我不得不用
pickle
来表示dok
。sparse.save_npz
不处理dok
。在相关问题 更多 >
编程相关推荐