2012-11-26 20 views
0

R中大csv文件,错误我想导入faily大文件(40Mrows X 4columns)。我结束了使用ffbase,尝试后sqldf导入在read.csv.ffdf

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

我不明白...

你有什么见解?

+0

人们可以用sqldf读取更大的文件。谨慎地展示你做了什么?你有没有试过导入你的数据的一个子集(比如几百行)? –

+0

sqldf包中的'read.csv.sql()'默认为内存不足的数据库。 'sqldf()'默认为一个内存数据库,但是你可以通过指定'dbname = tempfile()'来指定一个内存不足的数据库。 –

回答

2

做对不起我迟到了,我不得不R否进入最后3天。下面是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 

BTW请通知,该nbrows选项!不工作!... 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)也有一个缺陷,它不能准确显示的列...

而且为整个表...它的作品...!烟花!

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包加载大数据集

+0

您现在可以尝试从data.table库中获取fread函数。 –

3

你可能需要传递参数colClasses如下。正如你将与一个正常的read.csv

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