我有一个 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/