我应该在R中读取一个很大的csv文件(5.4 in,7m行,205列)。我已经用data.table::fread()
成功地读取了它。但是我想知道是否可以使用基本的read.csv()
来读取它
我试着使用暴力破解,但我的16 my内存无法容纳它。然后,我尝试使用“分而治之”(分块)策略,如下所示,但它仍然不起作用。我该怎么做呢?
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()
是如何工作的,它可以一次高效地读取所有数据,无论是在内存方面还是在时间方面?
发布于 2019-04-15 08:18:12
你的问题不是 fread()
**,,而是没有为你所有的(205)列定义导致的内存膨胀。但请注意,尝试将5.4 if的数据全部读取到16 if的RAM中实际上是在推动它,几乎可以肯定的是,您无法将所有的数据集都保存在内存中;即使您可以,当您尝试处理它时,您也会耗尽内存。所以你的方法是行不通的,你必须认真地决定你可以处理哪个子集-哪些字段你绝对需要开始**:
整数表示205列的整数:‘colClasses’表示整型列,‘
来积极地减少内存
- **read in and process chunks** (of rows) (use `skip, nrows` arguments, and search SO for questions on fread in chunks)
- **filter out all unneeded rows** (e.g. you may be able to do some crude processing to form a row-index of the subset rows you care about, and import that much smaller set later)
- **drop all unneeded columns** (use fread `select`/`drop` arguments (specify vectors of column names to keep or drop).
stringsAsFactors=FALSE
,这是一个臭名昭著的糟糕的默认设置,它会导致没有结束的内存,字段当前被读取为grief.fasttime
转换它们,以进行NA处理。现在,您可能希望删除包含大量NAs的列,或者删除杂乱的未处理的字符串字段。以上语法请参考?fread
和data.table
doc。如果你遇到一个特定的错误,发布一个2行数据的代码片段(head(data)
),你的代码和错误。
https://stackoverflow.com/questions/55680944
复制相似问题