【发布时间】:2019-09-04 22:47:02
【问题描述】:
我应该在 R 中读取一个大的 csv 文件(5.4GB,7m 行和 205 列)。我已使用 data.table::fread() 成功读取它。但是我想知道是否可以使用基本的read.csv()来阅读它?
我尝试使用蛮力,但我的 16GB RAM 无法容纳。然后我尝试使用如下的“分而治之”(分块)策略,但它仍然不起作用。我该怎么做?
dt1 <- read.csv('./ss13hus.csv', header = FALSE, nrows = 721900, skip =1)
print(paste(1, 'th chunk completed'))
system.time(
for (i in (1:9)){
tmp = read.csv('./ss13hus.csv', header = FALSE, nrows = 721900, skip = i * 721900 + 1)
dt1 <- rbind(dt1, tmp)
print(paste(i + 1, 'th chunk completed'))
}
)
我还想知道fread() 是如何工作的,它可以一次非常高效地读取所有数据,无论是在内存还是时间方面?
【问题讨论】:
-
我认为问题不在于加载数据,我猜是持有数据。更不用说使用
rbind进行迭代构建总是一件坏事:每次添加anything 时,R 都会对先前的数据进行完整的复制。对于以前的版本,我更喜欢do.call(rbind.data.frame, lapply(fnames, read.csv)),但我不知道这会解决你的大数据问题。如果这不起作用,您可以考虑一次只处理一部分数据,将其聚合 (?),保存,然后继续下一批。 -
是的,这叫做分块阅读。 但是,您的问题是由于没有为您的 205 列定义 colClasses 导致的内存膨胀(您真的需要阅读所有这些列吗?它会非常适合)
-
是的,我需要读取所有数据。但是我怎样才能摆脱内存问题呢?
-
为 205 列定义 colClasses,为整数列定义整数,为双列定义数字,为因子列定义因子。否则,事情的存储效率将非常低。请参阅
?fread和手册。
标签: r csv memory fread read.csv