569 Stimmen

Schnelles Einlesen sehr großer Tabellen als Dataframes

Ich habe sehr große Tabellen (30 Millionen Zeilen), die ich als Dataframes in R laden möchte. read.table() hat viele praktische Funktionen, aber es scheint, dass die Implementierung eine Menge Logik enthält, die alles verlangsamen würde. In meinem Fall gehe ich davon aus, dass ich die Spaltentypen im Voraus kenne, dass die Tabelle keine Spaltenüberschriften oder Zeilennamen enthält und dass es keine pathologischen Zeichen gibt, über die ich mir Sorgen machen müsste.

Ich weiß, dass das Einlesen einer Tabelle als Liste mit scan() kann recht schnell sein, z.B.:

datalist <- scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0)))

Aber einige meiner Versuche, dies in einen Datenrahmen zu konvertieren, scheinen die Leistung des oben genannten um den Faktor 6 zu verringern:

df <- as.data.frame(scan('myfile',sep='\t',list(url='',popularity=0,mintime=0,maxtime=0))))

Gibt es eine bessere Möglichkeit, dies zu tun? Oder möglicherweise eine ganz andere Herangehensweise an das Problem?

0voto

Aayush Agrawal Punkte 184

Anstelle des herkömmlichen read.table halte ich fread für eine schnellere Funktion. Die Angabe zusätzlicher Attribute, wie z. B. die Auswahl nur der erforderlichen Spalten, die Angabe von colclasses und string als Faktoren, wird die Zeit für den Import der Datei verringern.

data_frame <- fread("filename.csv",sep=",",header=FALSE,stringsAsFactors=FALSE,select=c(1,4,5,6,7),colClasses=c("as.numeric","as.character","as.numeric","as.Date","as.Factor"))

0voto

Bruno Gomes Punkte 85

Ich habe alle oben genannten Methoden ausprobiert, und [readr][1] hat am besten funktioniert. Ich habe nur 8gb RAM

Schleife für 20 Dateien, je 5gb, 7 Spalten:

read_fwf(arquivos[i],col_types = "ccccccc",fwf_cols(cnpj = c(4,17), nome = c(19,168), cpf = c(169,183), fantasia = c(169,223), sit.cadastral = c(224,225), dt.sitcadastral = c(226,233), cnae = c(376,382)))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X