Manipulación por filas de archivos grandes

Zaire

Entonces, tengo un archivo CSV grande con aproximadamente 280 columnas y mil millones de datos con un tamaño de archivo de aproximadamente 20 GB. A continuación se proporciona una muestra de este archivo (con aproximadamente 7 columnas y 4 filas):

SL No.,Roll No.,J_Date,F_Date,S1,S2,S3
1,00123456789,2004/09/11,2009/08/20,43,67,56
2,987654321,2010/04/01,2015/02/20,82,98,76
3,0123459876,2000/06/25,2005/10/02,72,84,02
4,000543216789,1990/08/29,1998/05/31,15,64,82

Ahora, dado el hecho de que el archivo es tan grande, tendría que leer este archivo en fragmentos más pequeños a la vez y poder especificar el tamaño del fragmento . Pero como puede haber visto en la muestra, "Roll No." debe leerse como un "carácter" y no como un "numérico" . También necesito agregar las columnas "S1", "S2", "S3" y escribir la suma en una nueva columna "MM" .

La salida de la muestra anterior tiene que ser algo como esto:

SL No.,Roll No.,J_Date,F_Date,S1,S2,S3,MM
1,00123456789,2004/09/11,2009/08/20,43,67,56,166
2,987654321,2010/04/01,2015/02/20,82,98,76,256
3,0123459876,2000/06/25,2005/10/02,72,84,02,158
4,000543216789,1990/08,29,1998/05/31,15,64,82,161

Sé que se han hecho preguntas similares antes, pero juro que no pude obtener una respuesta que funcionó para mí. Remití las siguientes consultas:

R: ¿Bucles para procesar grandes conjuntos de datos (GB) en fragmentos?

Recorte de un archivo csv enorme (3,5 GB) para leerlo en R

¿Cómo leo solo las líneas que cumplen una condición de un csv en R?

Leer números como cadenas

Lea la entrada numérica como cadena R y muchas más.

Este podría ser un buen momento para decir que soy un principiante total en lo que respecta a R, por lo que todo tipo de ayuda sería muy apreciada. He estado sentado en esto durante mucho tiempo.

Rosscova

No puedo decir que haya hecho esto antes, pero creo que debería funcionar.

library( data.table )

# set the input and output files
input.file <- "foo.csv"
output.file <- sub( "\\.csv$", "_output\\.csv", input.file )

# get column names by importing the first few lines
column.names <- names( fread( input.file, header = TRUE, nrows = 3L ) )

# write those column names as a line of text (header)
cat( paste( c( column.names, "MM" ), collapse = "," ),
     file = output.file, append = FALSE )
cat( "\n", file = output.file, append = TRUE )

# decide how many rows to read at a time
rows.at.a.time <- 1E4L

# begin looping
start.row <- 1L
while( TRUE ) {

    # read in only the specified lines
    input <- fread( input.file,
                    header = FALSE,
                    skip = start.row,
                    nrows = rows.at.a.time
    )

    # stop looping if no data was read
    if( nrow( input ) == 0L ) break

    # create the "MM" column
    input[ , MM := rowSums( .SD[ , 5:7 ] ) ]

    # append the data to the output file
    fwrite( input,
            file = output.file,
            append = TRUE, col.names = FALSE )

    # bump the `start.row` parameter
    start.row <- start.row + rows.at.a.time

    # stop reading if the end of the file was reached
    if( nrow( input ) < rows.at.a.time ) break

}

ACTUALIZACIÓN: para preservar las cadenas de caracteres, puede importar todas las columnas como caracteres especificando en la freadllamada dentro del ciclo:

colClasses = rep( "character", 280 )

Luego, para realizar las sumas de filas (ya que ahora tiene todas las columnas de caracteres), debe incluir una conversión allí. Lo siguiente reemplazaría la línea única (la que tiene este mismo comentario encima) en el código:

# create the "MM" column
input[ , MM := .SD[ , 5:7 ] %>%
           lapply( as.numeric ) %>%
           do.call( what = cbind ) %>%
           rowSums()
       ]

Donde 5:7se especifica aquí, puede reemplazar con cualquier vector de referencias de columna que se pasará arowSums()

Tenga en cuenta que si usa lo anterior con %>%tuberías, necesitará library(magrittr)en la parte superior de su código para cargar la función.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

Manipulación por filas de archivos grandes

Manipulación de archivos grandes en R

dividir archivos de texto muy grandes por filas máximas

manipulación de archivos unix

Cómo evitar la manipulación del sistema de archivos por parte de un usuario

vscode genera archivos de configuración grandes

vscode genera archivos de configuración grandes

División de archivos csv grandes

Conversión de archivos XML grandes a DataFrame

Python: iteración de archivos grandes

Clasificación de archivos grandes múltiples

Transmisión de archivos json grandes a csv

Manipulación de archivos: problemas de procedimiento

manipulación de filas tipo dplyr

Manipulación de datos (filas) en R

manipulación condicional y resumen de filas

manipulación de archivos binarios en python

Manipulación intrincada de archivos / texto

Manipulación de archivos con pandas

División de archivos html grandes en varios archivos

eliminar archivos grandes cometidos por error del historial de confirmaciones

¿Por qué el mmap de Python no funciona con archivos grandes?

encuentre los 5 archivos más grandes (por número de líneas) en el repositorio de git

¿Cómo cargar de manera eficiente archivos grandes en el almacenamiento IndexedDB? Mi aplicación falla en más de 100,000 filas

Git lfs (almacenamiento de archivos grandes) dice que los archivos administrados por lfs se modifican después de una extracción de git lfs

manipulación de filas de marcos de datos de pandas

Conversión de archivos de video grandes usando ffmpeg

Iteración eficiente de archivos de texto grandes

Procesamiento de archivos TIFF grandes y asignación de memoria