gpt4 book ai didi

python - 为什么我的 NumPy 数组占用的内存比应有的少*少*?

转载 作者:太空宇宙 更新时间:2023-11-04 02:20:37 29 4
gpt4 key购买 nike

我正在处理大型矩阵,例如 Movielens 20m dataset .我重组了在线文件,使其与页面上提到的尺寸(138000 x 27000)相匹配,因为原始文件包含的索引更大(138000 x 131000),但包含许多空列。只需丢弃那些空列并重新编制索引即可生成所需的维度。

无论如何,将稀疏 csv 文件转换为密集格式的代码片段如下所示:

import pandas as pd
from scipy import sparse

# note that the file is not the one described in the link, but the smaller one
X = pd.read_csv("ml-20m-dense.dat", sep=",", header=None)
mat = sparse.coo_matrix((X[2], (X[0], X[1]))).todense()

现在,内存中的估计大小应该接近 138000 * 27000 * 8/(1024^3) = 27.5 GB
然而,当我使用 htop 检查进程时,内存消耗显示我只有 7 GB 左右,尽管大约 32 GB 虚拟内存被保留。

起初我认为这可能是由于 pandas 阅读器或 scipy.sparse 包的一些“效率技巧”,以规避内存消耗。
但即使在我对其调用 PCA 函数之后,它也不会将事件内存消耗增加到应有的数量。请注意,调用 mat.nbytes 会返回估计的确切数量,因此 NumPy 似乎至少知道数据。


(PCA代码供引用:)

from fbpca import pca
result = pca(mat, k=3, raw=False, n_iter=3)

请注意,尽管 fbpca 使用随机算法,而且我只计算前三个组件,code仍然执行输入矩阵与(更小的)随机矩阵的(单个但完整的)矩阵乘法。本质上,它仍然必须至少访问输入矩阵中的每个元素一次。

最后的评论也使这与我发现的帖子略有不同,比如 this ,因为在那篇文章中从未真正访问过元素。

最佳答案

我认为您的问题在于 todense() 调用,它使用 np.asmatrix(self.toarray(order=order, out=out)) internallytoarray 使用 np.zeros 创建其输出。 (见 toarray_process_toarray_args )

所以您的问题可以简化为:为什么 np.zeros 没有分配足够的内存?

答案可能是惰性初始化零页:

Why does numpy.zeros takes up little space
Linux kernel: Role of zero page allocation at paging_init time

所以矩阵中的所有零区域实际上都在同一个物理内存块中,只有写入所有条目才会强制操作系统分配足够的物理内存。

关于python - 为什么我的 NumPy 数组占用的内存比应有的少*少*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748215/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com