【问题标题】:Importing large csv file in R, error in read.csv.ffdf在 R 中导入大型 csv 文件,read.csv.ffdf 中的错误
【发布时间】:2012-11-13 20:34:50
【问题描述】:

我想导入一个失败的大文件(40Mrows x 4columns)。在尝试sqldf后,我最终使用了ffbase

我试过base::read.csv:失败了。我试过sqldf::sqldf:它也失败了,说它不能再分配了。

我只是想复制 ffbase 小插图中给出的示例。

R) x <- data.frame(log=rep(c(FALSE, TRUE), length.out=26), int=1:26, dbl=1:26 + 0.1,   fac=factor(letters), ord=ordered(LETTERS), dct=Sys.time()+1:26, dat=seq(as.Date("1910/1/1"), length.out=26, by=1))
R) x <- x[c(13:1, 13:1),]
R) csvfile <- tempPathFile(path=getOption("fftempdir"), extension="csv")
R) write.csv(x, file=csvfile, row.names=FALSE)
R) y <- read.csv(file=csvfile, header=TRUE)
R) y
 log int  dbl fac ord                       dct        dat
1  FALSE  13 13.1   m   M 2012-11-26 11:21:29.15763 1910-01-13
2   TRUE  12 12.1   l   L 2012-11-26 11:21:28.15763 1910-01-12
3  FALSE  11 11.1   k   K 2012-11-26 11:21:27.15763 1910-01-11
4   TRUE  10 10.1   j   J 2012-11-26 11:21:26.15763 1910-01-10
...
23  TRUE   4  4.1   d   D 2012-11-26 11:21:20.15763 1910-01-04
24 FALSE   3  3.1   c   C 2012-11-26 11:21:19.15763 1910-01-03
25  TRUE   2  2.1   b   B 2012-11-26 11:21:18.15763 1910-01-02
26 FALSE   1  1.1   a   A 2012-11-26 11:21:17.15763 1910-01-01


# ---- !!!!! HERE !!!! ---- #
R) ffx <- read.csv.ffdf(file=csvfile, header=TRUE)
Erreur dans ff(initdata = initdata, length = length, levels = levels, ordered = ordered,  : vmode 'character' not implemented

我不明白...

你有什么见解吗?

【问题讨论】:

  • 使用 sqldf 可以读取更大的文件。想证明你做了什么?您是否尝试过导入数据的子集(比如几百行)?
  • sqldf 包中的 read.csv.sql() 默认为内存不足的数据库。 sqldf() 默认为内存数据库,但您可以通过指定 dbname=tempfile() 来指定内存外数据库。

标签: r csv import time-series


【解决方案1】:

您可能需要按如下方式传递参数 colClasses。就像你对普通的 read.csv 所做的那样

ffx <- read.csv.ffdf(file=csvfile, header=TRUE, colClasses = c("logical","integer","numeric","factor","factor","POSIXct","Date"))

【讨论】:

    【解决方案2】:

    对不起,我迟到了,过去 3 天我无法访问 R。这是read.csv的一些附加代码

      R) setAs("character","myDate", function(from) as.Date(from, format="%d/%m/%y") )
      R) system.time(data <- read.csv(file=filePath, sep=";", stringsAsFactors=TRUE, colClasses=c("factor","factor","numeric","myDate"), nrows=10));
    
        utilisateur     système      écoulé 
        0               0            0 
      R) system.time(data <- read.csv(file=filePath, sep=";", stringsAsFactors=TRUE, colClasses=c("factor","factor","numeric","myDate")));
        Erreur : impossible d'allouer un vecteur de taille 250.0 Mo
        Timing stopped at: 236.2 4.92 333.3 
    

    => 所以read.csv 无法处理那么多行。


    read.csv.sql 的相同测试是 sqldf 的包装器,仅用于 500 行。

    R) system.time(data <- read.csv.sql(filePath, dbname = tempfile(), header = T, row.names = F, sep=";"));
       utilisateur     système      écoulé 
       0.07            0.00        0.07 
    

    顺便说一句,请注意 nbrows 选项是 !NOT WORKING!... abd,您不能指示 colClasses 参数...

    R) system.time(data <- sqldf("select * from f", dbname = tempfile(), file.format = list(header = T, row.names = F, sep=";")));
       Erreur : impossible d'allouer un vecteur de taille 500.0 Mo
       Timing stopped at: 366.8 42.45 570.2
    

    对于整个表它崩溃... 奇怪,因为它应该是大数据的参考......


    最后使用包ff,50行

    R) system.time(data <- read.csv.ffdf(file=filePath, header=TRUE, nrows=50, colClasses=c("factor","factor","numeric","myDate"),sep=";"))
       utilisateur     système      écoulé 
       0.02            0.00         0.03 
    

    请注意head(data)也有一个bug,它不能准确显示列...

    对于整张桌子...它可以工作...!烟花!

    R) system.time(data <- read.csv.ffdf(file=filePath, header=TRUE, colClasses=c("factor","factor","numeric","myDate"),sep=";"))
       utilisateur     système      écoulé 
       409.69          14.42        547.75 
    

    对于一个 36M 行的表

    R) dim(data)
       [1] 36083010        4
    

    因此我建议 ff 包加载大数据集

    【讨论】:

    • 您现在可以试试 data.table 库中的 fread 函数。
    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    相关资源
    最近更新 更多