我有一个11GB.csv文件,我最终需要它作为一个big.matrix对象.从我所读到的内容来看,我认为我需要创建一个filebacked big.matrix对象,但我不知道如何做到这一点.

文件太大了,我无法直接加载到R中并从那里进行操作,就像我处理较小的数据集一样.如何从.csv文件生成big.matrix对象?

推荐答案

看看这是否有帮助.我将其作为答案发布,因为它包含的注释代码太多.

The strategy is to read chunks of 10K rows at a time and coerce them to a sparse matrix. Then, rbind those sub-matrices together.
It uses data.table::fread for speed and a function in package fpeek to count the number of lines in the data file. This function is also fast.

library(data.table)
library(Matrix)

flname <- "your_filename"
nlines <- fpeek::peek_count_lines(flname)
chunk <- 10*1024

passes <- nlines %/% chunk
remaining <- nlines %% chunk
skip <- 0

data_list <- vector("list", length = passes + (remaining > 0))
for(i in seq_len(passes)) {
  tmp <- fread(flname, sep = ",", colClasses = "double", skip = skip, nrows = chunk)
  data_list[[i]] <- Matrix(as.matrix(tmp), sparse = TRUE)
  skip <- skip + chunk
}
if(remaining > 0) {
  tmp <- fread(flname, sep = ",", colClasses = "double", skip = skip)
  data_list[[passes + 1L]] <- Matrix(as.matrix(tmp), sparse = TRUE)
}

sparse_mat <- do.call(rbind, data_list)
rm(data_list)

Test data

有了以下测试数据,一切正常.我还try 了一个更大的矩阵.

path是可选的.

path <- "~/Temp"
flname <- file.path(path, "big_example.csv")
a <- matrix(1:(25*1024), ncol = 1)
b <- matrix(rbinom(25*1024*10, size = 1, prob = 0.01), ncol = 10)
a <- cbind(a, b)
dim(a)
write.csv(a, fl, row.names = FALSE)

R相关问答推荐

是否可以 Select 安装不带文档的R包以更有效地存储?

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

通过使用str_detect对具有相似字符串的组进行分组

R for循环返回到先前值

S用事件解决物质平衡问题

移除仪表板Quarto中顶盖和车身之间的白色区域

使用rvest从多个页面抓取时避免404错误

将重复项转换为NA

计算直线上点到参考点的总距离

从多面条形图中删除可变部分

将具有坐标列表列的三角形转换为多个多边形

有没有办法一次粘贴所有列

如何使用FormC使简单算术运算得到的数字是正确的?

数值型数据与字符混合时如何进行绑定

Ggplot2如何找到存储在对象中的残差和拟合值?

需要一个函数来在第一行创建一个新变量,然后用新变量替换一个不同的变量(对于多行)

组合名称具有模式的列表的元素

将y轴格式更改为R中的百分比

从单个html段落中提取键-值对