Hace tiempo encontré un post1 de un blog que mostraba cómo mejorar el procesamiento de archivos grandes en R con sólo cambiar el formato de los archivos de datos. He consultado varias veces dicho post y, en algunas ocasiones, se me ha perdido, por lo que decidí hacer una sinopsis de este para futuras referencias.
Lo primero es hacerse de algunas bibliotecas.
install.packages(c("tidyverse", "data.table", "arrow", "duckdb"))
Y lo segundo, del diccionario de datos y del dataset. Los datos con los que se trabajarán corresponden a registros de viajes realizados con vehículos de alquiler en la ciudad de NY, USA, en 2020. Como muchas otras ciudades del mundo, NY ofrece datos de diversas naturalezas para quienes se interesen en su uso o estudio. Desafortunadamente, estos conjuntos de datos están a merced de los caprichos de los alcaldes, de sus administraciones y de otros factores, por lo que he colocado una copia aquí (enlaces indicados al inicio del párrafo) para asegurar la posteridad de esta entrada en el blog.
Descargados los datos y expandidos en un directorio, veremos que varios archivos del ZIP superan el gigabyte y que se trata de archivos separados por comas. Lo siguiente dará cuenta de los tamaños de los archivos.
fhvhv_csv_files <- list.files("original_csv", recursive=TRUE, full.names = TRUE)
data.frame(file = fhvhv_csv_files, size_Mb = file.size(fhvhv_csv_files) / 1024^2)
Consideremos que, en un típico flujo de trabajo con el computador, buscaremos leer de disco para copiar los datos a memoria y así permitir que el procesador haga algo con ellos. Si bien el formato CSV puede ser amigable para que cualquier explore el contenido de los archivos, hay otros formatos que pueden ayudar a hacer un mejor uso de los recursos de este flujo de trabajo.
Adicionalmente, aunque la tecnología de discos de estado sólido ha hecho que el acceso a un almacenamiento secundario de datos sea rápido, aún se considera que nada supera cargar los datos en memoria. En un caso como el de nuestro dataset, donde la cantidad de datos puede ser mayor o incluso agotar nuestra memoria, tenemos un problema. Por ejemplo, lo siguiente dará lugar a un error si se cuenta con poca memoria disponible.
library(tidyverse)
fhvhv_data <- map(fhvhv_csv_files, read_csv) %>% bind_rows(show_col_types=FALSE)
Ante estas situaciones, hay varias alternativas. Una de ellas es recurrir a cambiar el formato de almacenamiento de los datos empleando la biblioteca arrow.
library(arrow)
if(!dir.exists("converted_parquet")) {
dir.create("converted_parquet")
csv_ds <- open_dataset("original_csv",
format = "csv",
partitioning = c("year", "month"))
write_dataset(csv_ds,
"converted_parquet",
format = "parquet",
partitioning = c("year", "month"))
}
El resultado podremos compararlo con:
fhvhv_csv_files <- list.files("original_csv", recursive=TRUE, full.names = TRUE)
fhvhv_files <- list.files("converted_parquet", full.names = TRUE, recursive = TRUE)
data.frame(csv_file = fhvhv_csv_files,
parquet_file = fhvhv_files,
csv_size_Mb = file.size(fhvhv_csv_files) / 1024^2,
parquet_size_Mb = file.size(fhvhv_files) / 1024^2)
Ahora, a fin de mostrar que no sólo tenemos una reducción en tamaño sino también una ganancia en velocidad de procesamiento, usando el lector CSV de la biblioteca tidyverse veremos:
system.time(invisible(readr::read_csv(fhvhv_csv_files[[1]], show_col_types = FALSE)))
user system elapsed
79.982 6.362 31.824
y podremos contrastarlo contra lo que read_parquet de arrow nos muestra:
## arrow package parquet reader
system.time(invisible(read_parquet(fhvhv_files[[1]])))
user system elapsed
5.761 2.226 22.533
Veremos que la reducción de tiempo es de casi 16 veces. Nada despreciable.
Referencias
- HBS Research Computing Services, «large_data_in_R«, hbs-rcs.github.io, blog. Updated:. 2021.12.06; visited: 2025.11.08. URL: https://hbs-rcs.github.io/large_data_in_R/.


