2011-09-07 19 views
14

Tengo un archivo .csv: example.csv con 8000 columnas x 40000 filas. El archivo csv tiene un encabezado de cadena para cada columna. Todos los campos contienen valores enteros entre 0 y 10. Cuando intento cargar este archivo con read.csv, resulta extremadamente lento. También es muy lento cuando agrego un parámetro nrow = 100. Me pregunto si hay una forma de acelerar el read.csv, o usar alguna otra función en lugar de read.csv para cargar el archivo en la memoria como una matriz o un data.frame.read.csv es extremadamente lento en la lectura de archivos csv con un gran número de columnas

Gracias de antemano.

+2

por favor comparta el código que está usando para leer.csv - hay muchas opciones para mejorar el rendimiento, vea "read.table – mdsumner

Respuesta

15

Si el archivo CSV contiene sólo números enteros, se debe utilizar scan en lugar de read.csv, ya ?read.csv dice:

‘read.table’ is not the right tool for reading large matrices, 
especially those with many columns: it is designed to read _data 
frames_ which may have columns of very different classes. Use 
‘scan’ instead for matrices. 

Desde su archivo tiene un encabezado, necesitará skip=1, y probablemente será más rápido si establecer what=integer(). Si debe usar read.csv y el consumo de velocidad/memoria es una preocupación, establecer el argumento colClasses es de gran ayuda.

+1

Puede volver a agregar los nombres de sus columnas leyendo la línea única del encabezado como un vector con la función 'readLines()' y modificando los nombres de las columnas de su matriz. – John

+1

Gracias. Acabo de encontrar otra función envoltorio hacer uso de la función scan(): read.matrix en el paquete tseries. Afirma que es más rápido que read.csv. – rninja

3

Si lee el archivo con frecuencia, podría valer la pena guardarlo de R en un formato binario utilizando la función save. Especificar compress=FALSE a menudo da como resultado tiempos de carga más rápidos.

... A continuación, puede cargarlo con la función (¡sorpresa!) load.

d <- as.data.frame(matrix(1:1e6,ncol=1000)) 
write.csv(d, "c:/foo.csv", row.names=FALSE) 

# Load file with read.csv 
system.time(a <- read.csv("c:/foo.csv")) # 3.18 sec 

# Load file using scan 
system.time(b <- matrix(scan("c:/foo.csv", 0L, skip=1, sep=','), 
         ncol=1000, byrow=TRUE)) # 0.55 sec 

# Load (binary) file using load 
save(d, file="c:/foo.bin", compress=FALSE) 
system.time(load("c:/foo.bin")) # 0.09 sec 
+2

Si la compresión acelera las cosas depende de múltiples factores y se puede probar en una base de archivo/máquina. La velocidad de alta definición, la velocidad de la CPU y el grado de compresión logrado contribuyen a que el archivo comprimido o no comprimido sea más rápido de cargar. Pero, en general, sin comprimir puede ser más rápido cuando la velocidad de la unidad es buena y la velocidad de la CPU no lo es, mientras que lo contrario es cierto para la compresión. Por ejemplo, tendería a querer usar escritura comprimida en unidades flash USB en una laptop rápida. – John

+0

@John - Buen punto. Es por eso que dije "a menudo" ;-) – Tommy

8

Probar usando fread{data.table}. Esta es una de las formas más rápidas de leer los archivos .csv en R. Hay un good benchmark here.

library(data.table) 

data <- fread("c:/data.csv") 

Si quieres que sea aún más rápido, también puede leer sólo el subconjunto de columnas que desea utilizar:

data <- fread("c:/data.csv", select = c("col1", "col2", "col3")) 
+0

fread se cuelga al instante en mis datos (tiene un poco más de un millón de columnas) – shreyasgm

+0

Esto es extraño; Le recomendaría que desinstale y reinstale la biblioteca: satsmove.packages ("data.table"); install.packages ("data.table") '. Si el problema persiste, puede considerar abrir un 'tema' en el sitio web del proyecto https://github.com/Rdatatable/data.table/wiki –

3

Proveedores readr paquete de Hadley Wickham:

library(readr) 
data <- read_csv("file.csv") 
Cuestiones relacionadas