首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过分而治之的策略使用`read.csv`读取巨大的csv文件?

通过分而治之的策略使用`read.csv`读取巨大的csv文件?
EN

Stack Overflow用户
提问于 2019-04-15 07:29:24
回答 1查看 351关注 0票数 0

我应该在R中读取一个很大的csv文件(5.4 in,7m行,205列)。我已经用data.table::fread()成功地读取了它。但是我想知道是否可以使用基本的read.csv()来读取它

我试着使用暴力破解,但我的16 my内存无法容纳它。然后,我尝试使用“分而治之”(分块)策略,如下所示,但它仍然不起作用。我该怎么做呢?

代码语言:javascript
复制
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()是如何工作的,它可以一次高效地读取所有数据,无论是在内存方面还是在时间方面?

EN

回答 1

Stack Overflow用户

发布于 2019-04-15 08:18:12

你的问题不是 fread()**,,而是没有为你所有的(205)列定义导致的内存膨胀。但请注意,尝试将5.4 if的数据全部读取到16 if的RAM中实际上是在推动它,几乎可以肯定的是,您无法将所有的数据集都保存在内存中;即使您可以,当您尝试处理它时,您也会耗尽内存。所以你的方法是行不通的,你必须认真地决定你可以处理哪个子集-哪些字段你绝对需要开始**:

整数表示205列的整数:‘colClasses’表示整型列,‘

  • Define’表示双精度列,‘colClasses’表示布尔列,‘’表示因子列。
  • 如果你不能容纳所有的7m行x 205列(你几乎肯定不能),那么你就需要通过执行一些或者全部的following

来积极地减少内存

代码语言:javascript
复制
- **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.
  • Date/datetime (这对于内存使用来说是个坏消息,有数百万个唯一的字符串)。要么完全删除开头的日期列,要么以块的形式读取数据,并在参数中使用functions.
  • Look包或标准基础fasttime转换它们,以进行NA处理。现在,您可能希望删除包含大量NAs的列,或者删除杂乱的未处理的字符串字段。

以上语法请参考?freaddata.table doc。如果你遇到一个特定的错误,发布一个2行数据的代码片段(head(data)),你的代码和错误。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55680944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档