Así que tengo un archivo de datos (separado por punto y coma) que tiene muchos detalles y filas incompletas (lo que hace que Access y SQL se bloqueen). Es un conjunto de datos a nivel de condado dividido en segmentos, subsegmentos y subsegmentos (para un total de ~ 200 factores) durante 40 años. En resumen, es enorme y no va a caber en la memoria si intento simplemente leerlo.
Entonces mi pregunta es esta, dado que quiero todos los condados, pero solo un año (y solo el nivel más alto de segmento ... lo que lleva a aproximadamente 100,000 filas al final), ¿cuál sería la mejor manera de obtener este resumen en R?
Actualmente estoy tratando de eliminar años irrelevantes con Python, superando el límite leyendo y operando en una línea a la vez, pero preferiría una solución solo R (paquetes CRAN OK). ¿Existe una forma similar de leer en archivos un fragmento a la vez en R?
Cualquier idea será muy apreciada.
Actualizar:
- Restricciones
- Necesita usar mi máquina, por lo que no hay instancias EC2
- Tan solo R como sea posible. La velocidad y los recursos no son una preocupación en este caso ... siempre que mi máquina no explote ...
- Como puede ver a continuación, los datos contienen tipos mixtos, en los que necesito operar más tarde
- Datos
- Los datos son de 3,5 GB, con aproximadamente 8,5 millones de filas y 17 columnas.
- Un par de miles de filas (~ 2k) están mal formadas, con solo una columna en lugar de 17
- Estos son completamente insignificantes y pueden descartarse
- Solo necesito ~ 100,000 filas de este archivo (ver más abajo)
Ejemplo de datos:
County; State; Year; Quarter; Segment; Sub-Segment; Sub-Sub-Segment; GDP; ...
Ada County;NC;2009;4;FIRE;Financial;Banks;80.1; ...
Ada County;NC;2010;1;FIRE;Financial;Banks;82.5; ...
NC [Malformed row]
[8.5 Mill rows]
Quiero cortar algunas columnas y elegir dos de los 40 años disponibles (2009-2010 de 1980-2020), para que los datos puedan caber en R:
County; State; Year; Quarter; Segment; GDP; ...
Ada County;NC;2009;4;FIRE;80.1; ...
Ada County;NC;2010;1;FIRE;82.5; ...
[~200,000 rows]
Resultados:
Después de jugar con todas las sugerencias hechas, decidí que readLines, sugerido por JD y Marek, funcionaría mejor. Le di a Marek el cheque porque dio una implementación de muestra.
Reproduje una versión ligeramente adaptada de la implementación de Marek para mi respuesta final aquí, usando strsplit y cat para mantener solo las columnas que quiero.
También debe tenerse en cuenta que esto es MUCHO menos eficiente que Python ... como en, Python muerde el archivo de 3.5GB en 5 minutos mientras que R toma alrededor de 60 ... pero si todo lo que tiene es R, entonces este es el boleto.
## Open a connection separately to hold the cursor position
file.in <- file('bad_data.txt', 'rt')
file.out <- file('chopped_data.txt', 'wt')
line <- readLines(file.in, n=1)
line.split <- strsplit(line, ';')
# Stitching together only the columns we want
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
## Use a loop to read in the rest of the lines
line <- readLines(file.in, n=1)
while (length(line)) {
line.split <- strsplit(line, ';')
if (length(line.split[[1]]) > 1) {
if (line.split[[1]][3] == '2009') {
cat(line.split[[1]][1:5], line.split[[1]][8], sep = ';', file = file.out, fill = TRUE)
}
}
line<- readLines(file.in, n=1)
}
close(file.in)
close(file.out)
Fallos por enfoque:
- sqldf
- Esto es definitivamente lo que usaré para este tipo de problema en el futuro si los datos están bien formados. Sin embargo, si no es así, SQLite se ahoga.
- Mapa reducido
- Para ser honesto, los médicos me intimidaron un poco en este caso, así que no pude intentarlo. Parecía que también requería que el objeto estuviera en la memoria, lo que anularía el punto si ese fuera el caso.
- gran memoria
- Este enfoque está claramente vinculado a los datos, pero solo puede manejar un tipo a la vez. Como resultado, todos mis vectores de caracteres cayeron cuando se pusieron en una tabla grande. Sin embargo, si necesito diseñar grandes conjuntos de datos para el futuro, consideraría usar solo números para mantener viva esta opción.
- escanear
- El escaneo parecía tener problemas de tipo similares a los de la memoria grande, pero con todos los mecanismos de readLines. En resumen, esta vez no encajaba bien.
sedy / oawkcreando una versión reducida del CSV que pueda leer directamente. Dado que esto es más una solución que una respuesta, lo dejaré como comentario.