gpt4 book ai didi

python - 就速度和内存而言,迭代一个非常大的循环并将 scipy 稀疏矩阵存储到文件中的最有效方法

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

我有一个包含 23094592 (2*10^7) 行的表格,它给出了 11701890 个唯一用户对 1000000 个唯一项目的评分。我正在尝试构建用户与项目的评级矩阵 (11701890 * 1000000) 以进行协同过滤。

这是我实现的伪代码:

from scipy.sparse import csr_matrix
import cPickle

totalRows = 23094592
uniqueUsers = 11701890
uniqueItems = 1000000
M = csr_matrix((uniqueUsers, uniqueItems))
for i in range(totalRows):
M[userIndex,itemIndex] = ratings[i]
cPickle.dump(M, open('ratings.pkl', 'w+b'))

但是,我一直在谷歌云中 RAM 为 52GB 的虚拟机上运行此代码,现在大约需要整整 2 天才能完成大约 20% 的循环。

此外,虽然稀疏矩阵 ratings.pkl 文件的 M.data.bytes 在某个时间点显示约为 100 MB,但使用 du - sh(该文件实际使用的空间要多得多 - 大约 3 GB !!

这也导致了内存问题,我不得不增加谷歌云中 VM 的磁盘大小。

有人可以建议任何方法以更快的方式迭代这个巨大的循环并更有效地存储稀疏矩阵。

最佳答案

scipy.sparse.csr_matrix 中所述docs 你可以通过以下方式创建一个稀疏矩阵:

csr_matrix((data, (row_ind, col_ind)), [shape=(M, N)])

where data, row_ind and col_ind satisfy the relationship

a[row_ind[k], col_ind[k]] = data[k].

我用一些相同大小的随机生成数据进行了尝试,创建矩阵大约需要 18 秒。

from scipy.sparse import csr_matrix
import numpy as np
totalRows = 23094592
UniqueUsers = 11701890
UniqueItems = 1000000
users = np.random.randint(UniqueUsers, size=totalRows)
items = np.random.randint(UniqueItems, size=totalRows)
ratings = np.random.randint(5, size=totalRows)
M = csr_matrix((ratings, (users, items)), shape=(UniqueUsers, UniqueItems))

这将创建一个稀疏矩阵,其中 M[users[k], items[k]] = ratings[k]

您应该确保 usersitems 是每个唯一用户和项目的基于 0 的索引,也许可以使用 scikit-learn 中的 LabelEncoder。

关于python - 就速度和内存而言,迭代一个非常大的循环并将 scipy 稀疏矩阵存储到文件中的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43558121/

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