我有一个非常大的数GB文件,加载到内存中的成本太高。但是,文件中行的顺序不是随机的。有没有办法使用类似fread的东西读取行的随机子集?
例如这样的事情?
data <- fread("data_file", nrows_sample = 90000)
这github post表明一种可能性就是做这样的事情:
fread("shuf -n 5 data_file")
然而,这对我不起作用。有什么想法吗?
答案 0 :(得分:3)
使用tidyverse(而不是data.table),你可以这样做:
virtual
答案 1 :(得分:1)
如果您的数据文件恰好是文本文件,那么使用包LaF
的解决方案可能很有用:
library(LaF)
# Prepare dummy data
mat <- matrix(sample(letters,10*1000000,T), nrow = 1000000)
dim(mat)
#[1] 1000000 10
write.table(mat, "tmp.csv",
row.names = F,
sep = ",",
quote = F)
# Read 90'000 random lines
start <- Sys.time()
random_mat <- sample_lines(filename = "tmp.csv",
n = 90000,
nlines = 1000000)
random_mat <- do.call("rbind",strsplit(random_mat,","))
Sys.time() - start
#Time difference of 1.135546 secs
dim(random_mat)
#[1] 90000 10