【问题标题】:Writing a very large sparse matrix to file in R将一个非常大的稀疏矩阵写入 R 中的文件
【发布时间】:2019-07-09 18:59:35
【问题描述】:

我有一个稀疏矩阵,尺寸约为 400K x ~8k。

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

按照这篇文章的建议,我使用了 MASS 包中的 write.matrix 函数: How to save an adjacency matrix as a CSV file?

但是,我收到以下错误:

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)

注意:当代码只是 1000 或 3000 而不是 9000 时,它似乎被写入文件,尽管速度很慢。

非常感谢。

【问题讨论】:

  • 您的文件会很大。如果将其保存为文件中的稀疏矩阵会不会更好?
  • MASS::write.matrix 的第一行是x &lt;- as.matrix(x),因此您可能会遇到内存限制。如果您将此行注释掉,您可能可以将带有零的矩阵写为.。这是可行的吗/你能在你读到的 prgram 中找到它吗?或者其他程序能否读取mtx 文件——见Matrix::writeMM
  • 400,000 x 8,000 = 3,200,000,000 字节仅用于处理逗号和回车。然后添加您的数据。您将需要更多可用的内存。此外,您将需要一个现代文件系统才能处理文件大小。如果您使用 HFS,则需要使用 7.5.2 或更高版本(如果您的计算机是从以前版本的 MacOS 升级并且最初不是 High Sierra,这可能会出现问题)。如果您将此文件保存到 FAT32 分区,您还会遇到文件太大而无法保存在单个文件中的问题。
  • @user20650:谢谢。另一个程序需要一个选项卡或 csv 文件并且需要 0。但是,我也尝试只用'.'编写稀疏矩阵,我得到了同样的错误。

标签: r bigdata sparse-matrix


【解决方案1】:

这是一种使用 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') 导出值。

【讨论】:

  • writeMM 很慢。有人找到一种更快的方法将大型稀疏矩阵从 R 传输到 Python 吗?
猜你喜欢
  • 2023-03-05
  • 2011-06-01
  • 2018-02-09
  • 2013-07-08
  • 2015-09-05
  • 2017-01-10
  • 2014-09-07
  • 2018-05-12
  • 2011-03-11
相关资源
最近更新 更多