2012-11-26 51 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"))