test=ldply(list.files(path="C:/rcsv",pattern="csv",full.names=TRUE),function(filename) {
dum=read.csv(filename)
dum$filename=filename
return(dum)
})
错误:无法分配大小为19.2 Mb的矢量
我有 5 .csv 文件,每个 100万条目。现在我想读取数据框中的所有内容并执行一些计算,但我无法做到这一点,因为它不会读取文件。我该如何解决这个问题?
答案 0 :(得分:1)
最简单的答案:购买更多内存。如果您经常使用大型数据集在R中工作,那么它是值得的。如果您没有足够的内存来加载文件,则可能没有足够的内容来操作它们。
让我们假设您可以将这些数据保存在RAM中并按照您的意愿进行操作,以便读取它是您唯一的问题。对您的问题的评论提供了一些想法。您也可以使用scan()
来阅读您的文件,而不是read.csv
。它需要更多的设置,但更快,相对内存友好。
有几个软件包可以帮助那些数据对于内存来说太大的人。我熟悉的那个(虽然由于RAM价格下降,我多年没用过它)是filehash
。这会将您的数据存储在磁盘上而不是RAM中,但您仍然以相同的方式与它进行交互。它会慢一点,但很可能解决你的问题。
library(filehash)
dbCreate('tmp.db')
dbhandle <- dbInit('tmp.db')
db <- db2env(dbhandle)
db$test <- ldply(list.files(path="C:/rcsv",pattern="csv",full.names=TRUE),
function(filename) {
db$dum <- read.csv(filename)
db$dum$filename <- filename
return(dum)
})
我不知道这种做法是否已被弃用,但我相信它仍然有效。我不确定ldply()
将临时内容放入RAM的程度。如果失败,您可以在db
内创建一个列表,在for
循环中将每个文件读入列表,然后自己将它们组合在一起。
另一种方法可能是创建一个sqlite数据库并使用sqldf包中的read.csv.sql()
将所有内容放在那里然后绑定它们。然后在最后,您可以读出最终的数据帧。