我有一个脚本,可以读入许多短文档的语料库,并使用sklearn
对它们进行矢量化。结果是一个大的,稀疏的矩阵(具体来说,一个scipy.sparse.csr.csr_matrix
),尺寸为371k x 100k。我的目标是将其标准化,使得每行总和为1,即将每个条目除以其行中条目的总和。我尝试了几种方法,每次都给了我一个MemoryError
:
M /= M.sum(axis=1)
M_normalized = sklearn.preprocessing.normalize(M, axis=1, norm='l1')
对于第一个选项,我使用pdb
在规范化步骤之前停止脚本,这样我就可以用htop监视内存消耗。有趣的是,只要我在脚本中执行M /= M.sum(axis=1)
,就会在一秒钟内立即抛出内存错误。
我的机器有16GB内存+ 16GB交换,但在进行规范化的程序中只有大约8GB + 16GB空闲。
任何人都能解释为什么所有这些方法都会遇到内存问题吗?当然第三个至少应该只使用少量内存,因为它一次只能查看一行。是否有一种更节省内存的方法来实现这一目标?