r - 将 11 GB .csv 文件加载为 big.matrix 对象

标签 r csv bigdata r-bigmemory

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

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

最佳答案

看看这是否有帮助。我作为答案发布,因为它包含太多评论代码。

该策略是一次读取 10K 行的 block ,并将它们强制转换为稀疏矩阵。然后,将这些子矩阵rbind在一起。
它使用 data.table::fread 来提高速度,并使用 fpeek 包中的函数来计算数据文件中的行数。这个功能也很快。

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)

测试数据

通过以下测试数据一切正常。我也尝试过使用更大的矩阵。

路径是可选的。

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 - 将 11 GB .csv 文件加载为 big.matrix 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73093697/

相关文章:

r - 通过在 R 中填充 NA - 使栅格达到相同程度

r - 计算 ID 为 "break variable"的特定日期的天数

csv - Neo4j Cypher-使用LOAD CSV创建节点并设置标签

MYSQL+加载数据INFILE+检查字段

hadoop - 在分布式 Hadoop 集群中使用 ENV 变量

r - 有约束的NLS优化:曲线下面积相等

随机删除条件为 R 的行(又名 rdeleteIf)

javascript - 在 Safari 中使用 blob 保存 CSV 文件

MySQL静态表的最佳索引

hadoop - 我们可以使用带有Snappy压缩的Hive表使用TEXT FILE格式吗?