在R中导入大型csv文件,read.csv.ffdf中出错

时间:2012-11-26 11:10:18

标签: r csv import time-series

我想导入一个快速的大文件(40Mrows x 4columns)。在尝试ffbase

之后,我最终使用了sqldf

我试过了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

我不明白......

你有什么见解吗?

2 个答案:

答案 0 :(得分:3)

您可能需要传递参数colClasses,如下所示。就像使用普通的read.csv

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

答案 1 :(得分: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 

=&GT;所以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

BTW请注意colClasses选项是!不工作!... abd你不能指出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

整张桌子都崩溃了...... 奇怪,因为它应该是大数据的参考...


最后使用包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 ,包含50行

head(data)

请注意,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 也有错误,它无法准确显示列...

对于整张桌子......它的工作......!烟火!

R) dim(data)
   [1] 36083010        4

对于36M行表

ff

因此,我建议{{1}}包加载大数据集