我应该在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()
如何工作,无论在记忆或时间方面,都可以一次性读取所有数据?
你的问题不是fread()
,它是由于没有为你的所有(205)列定义colClasses而引起的内存膨胀。但请注意,尝试将所有5.4GB读入16GB内存RAM的确是首先推动它,你几乎肯定无法将所有数据集保存在内存中;即使你可以,只要你试图处理它,你就会熄灭记忆。所以你的方法不会飞,你必须决定你可以处理哪个子集 - 你绝对需要开始哪些领域:
skip, nrows
参数,并搜索SO以获取有关块中fread的问题)
过滤掉所有不需要的行(例如,您可以进行一些原始处理以形成您关心的子集行的行索引,然后导入更小的集合)
删除所有不需要的列(使用fread select
/ drop
参数(指定要保留或删除的列名称的向量)。stringsAsFactors=FALSE
,这是R中一个臭名昭着的错误默认值,它不会导致记忆悲伤的结束。fasttime
包或标准基本函数进行转换。请参阅?fread
和data.table
doc以获取上述语法。如果您遇到特定错误,请发布一段代表2行数据(head(data)
),您的代码和错误。