- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在处理大型矩阵,例如 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))
internally 。toarray
使用 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/
当我运行我的应用程序时,我在控制台中收到一条消息: 2011-11-16 19:17:41.292 Juice[8674:707] Applications are expected to have
我在 JavaScript 中使用了这个语句,但是当我尝试在 TypeScript 项目中使用它时出现错误。它在提示 fetch(...args) const fetcher = (...args)
我是一名优秀的程序员,十分优秀!