将非常大的稀疏矩阵写入R中的文件

将非常大的稀疏矩阵写入R中的文件,r,bigdata,sparse-matrix,R,Bigdata,Sparse Matrix,我有一个维数为~400K x~8k的稀疏矩阵 我想将其保存为制表符分隔文件或csv文件,因为我需要它作为另一个程序的输入 我使用了MASS包中的write.matrix函数,正如本文所建议的: 但是,我得到以下错误: library(MASS) write.matrix(data,"data_sparseMat.txt",sep="\t") #Error in asMethod(object) : Cholmod error 'problem too large' at file ../C

我有一个维数为~400K x~8k的稀疏矩阵

我想将其保存为制表符分隔文件或csv文件,因为我需要它作为另一个程序的输入

我使用了MASS包中的write.matrix函数,正如本文所建议的:

但是,我得到以下错误:

library(MASS)
write.matrix(data,"data_sparseMat.txt",sep="\t")  
#Error in asMethod(object) : Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105
查看帮助,然后我尝试给出blocksize参数。我试了1000,10000,100000。所有人都给了我同样的错误

write.matrix(data,"data_sparseMat.txt",sep="\t", blocksize=1000)  
Error in asMethod(object) : 
  Cholmod error 'problem too large' at file ../Core/cholmod_dense.c, line 105
如果有任何见解,我将不胜感激,我忽略了什么

R版本:

R version 3.5.2 (2018-12-20)
Platform: x86_64-apple-darwin15.6.0 (64-bit)
Running under: macOS High Sierra 10.13.6
例如:

w <- data.table( "id" = 1:300000 , "code" = paste(letters,1:9000,sep=""), "measure"=1:3000)
w$id <- factor(w$id)
w$code <- factor(w$code)

z<- sparseMatrix(as.integer(w$id),as.integer(w$code),x=w$measure,dimnames=list(levels(w$id),levels(w$code)))
write.matrix(z,"sparseTest.txt",sep="\t")
write.matrix(z,"sparseTest.txt",sep="\t",blocksize=100000)

w这是一个使用Python的变通方法。我设法导出了一个在R中太大的矩阵

将R中的数据导出为稀疏矩阵:

library(Matrix)
write(colnames(sparsematrix), file = "colnames.txt")
write(rownames(sparsematrix), file = "rownames.txt")
writeMM(sparsematrix, file = "sparsematrix.txt")
在Python中读取然后转换:

from scipy import sparse, io
import pandas as pd
import numpy as np

sparsematrix = io.mmread('sparsematrix.txt')

m_dense = sparsematrix.toarray()

var_names = np.genfromtxt('rownames.txt', dtype=str)
col_names = np.genfromtxt('colnames.txt', dtype=str)

# Export to txt:
df = pd.DataFrame(m_dense, columns=col_names, index=var_names)
df.to_csv('export_sparsematrix.txt', sep='\t', header=True, index=True, index_label='Somelabel')

您可以省略行和列名部分,仅使用
np.savetxt('m_dense.txt',m_dense,delimiter='\t')
导出值

你的档案会很大。如果将其保存为文件上的稀疏矩阵,不是更好吗?
MASS::write.matrix
的第一行是
x40000x8000=32000000字节,仅用于处理逗号和回车符。然后添加数据。您将需要比可用内存更多的内存。此外,您还需要一个现代化的文件系统,以便能够处理文件大小。如果您使用的是HFS,则需要使用7.5.2或更高版本(如果您的计算机是从以前版本的MacOS升级而来的,并且最初不是高版本,则可能会出现问题)。如果要将此文件保存到FAT32分区,您也会遇到一个问题,即文件太大,无法保存在单个文件中。@user20650:谢谢。另一个程序需要一个选项卡或csv文件,并且需要0。但是,我也尝试只使用“.”编写sparsematrix,我得到了相同的错误。writeMM非常慢。有人找到一种更快的方法将一个大的稀疏矩阵从R转移到Python吗?