我有一个scipy.sparse。csc_matrix,我想用scipy.sparse.csc_matrix.toarray()
变换成数组。当我对一个小数据集使用这个函数时,它工作得很好。但是,当我将它用于大型数据集时,python解释器在调用该函数时立即崩溃,窗口关闭,没有错误消息。我试图转换成数组的矩阵是用sklearn.feature_extraction.text.CountVectorizer
创建的。我在Ubuntu 12.04上运行python 2.7.3。更复杂的是,当我试图从终端运行脚本以保存任何错误消息时,日志没有记录任何错误消息,并且确实在脚本中更早地停止(尽管如果不调用toarray()
是完整的)。
您不能在大型稀疏矩阵上调用toarray
,因为它将尝试将所有值(包括零)显式地存储在连续的内存块中。
举个例子,假设你有一个稀疏矩阵A:
>>> A.shape
(10000, 100000)
>>> A.nnz # non zero entries
47231
>>> A.dtype.itemsize
8
非零数据的MB大小为:
>>> (A.nnz * A.dtype.itemsize) / 1e6
0.377848
你可以检查这是否匹配稀疏矩阵数据结构的data
数组的大小:
>>> A.data / 1e6
0.377848
根据稀疏矩阵数据结构的类型(CSR, CSC, COO…),它还以各种方式存储非零项的位置。一般来说,这会使内存使用量增加一倍。因此,A使用的总内存约为700kB。
转换为连续数组表示将物化内存中的所有零,结果大小将为:
>>> A.shape[0] * A.shape[1] * A.dtype.itemsize / 1e6
8000.0
本例中为8GB,而原始的稀疏表示不到1MB。
只是删除。toarray,并使用稀疏矩阵作为分类器的输入,它工作得很好