Cortar y parsear ficheros de tamaño grandes

En pleno apogeo del big data y el almacenamiento y tratamiento de grandes cantidades de información, nos podemos y seguro que nos encontraremos con el problema de tener que parsear, subir y cortar ficheros grandes. Normalmente cuando hablemos de big data y ficheros grandes, nos vamos a enfrentar casi seguro a ficheros de texto plano, en detrimento de ficheros xml.

comando sed

Por que texto plano y no xml

Pues simplemente por el tamaño, aunque es mas seguro y mas fácil gestionar la información en ficheros xml, el simple echo de que esta información vaya entre etiquetas hace que el tamaño del fichero aumente considerablemente y si esto lo multiplicamos a mucha información en el mismo fichero acabaríamos teniendo que tratar ficheros enormes de los cuales solo un porcentaje del peso del archivo equivale a información, el resto serian etiquetas.

 

Ficheros demasiado grandes

Otra cosa muy a tener en cuenta a la hora de trabajar con grandes ficheros será la memoria ram que dispongamos en la maquina, no tiene mucho sentido intentar parsear o abrir un fichero de 100 gigas o mas cuando nuestro ordenador o servidor solo dispone de 16 gigas de ram, para solucionar esto nos veremos obligados a dividir dicho fichero y 10 de 10 gigas, 20 de 5 gigas o lo que nos resulte mas cómodo.

Para hacer esto nos ayudaremos del comando split un comando muy útil de linux para trabajar con ficheros que nos permite cortar un archivo en varios indicando si lo que queremos es que los agrupe por tamaño o por filas, en mi caso suelo usar mas por filas ya que si vamos a parsear un fichero de texto plano, este suele ir separados por lineas y dentro de cada linea sus separadores para los campos como por ejemplo un formato clásico de csv:

03;»Alberto»;»2017-03-02″;45000;

En el caso anterior si dividiéramos el fichero por tamaño (megas) nos dividiría la última linea de cada fichero y la primera de todos a partir del segundo, lo que nos haría imposible o muy difícil acceder a la información con seguridad.

split -b 2000m fichero.csv (esto partirá el fichero en ficheros de 2 gigas sin extensión)

Pero como he dicho antes prefiero utilizar un corte por cada linea en lugar de por tamaño y en mi caso suelo utilizar este:

split -l 2000 fichero.csv (esto partirá el fichero en ficheros de 2000 lineas respetándolas)

Como se puede ver es uno de los comandos mas faciles que hay en linux «comando» «opcion» «fichero».

Subir o descargar ficheros al servidor o maquina que los procesará

Es posible que no queramos tratar los ficheros directamente en nuestro ordenador, si no en otra maquina o servidor, a los que tendremos que subir nuestros ficheros, esto lo haremos también después de haber cortado os ficheros ya que si intentamos subir un fichero de 100 gigas o mas podemos encontrarnos con problemas como que el sistema de ficheros no acepte ese tamaño o que intentemos subirlo y la conexión se pierda una y otra vez, provocando que nunca consigamos subir el fichero completo.

Seguramente aun después de haber cortado los ficheros, estos seguirán siendo muy grandes y también muchos, para subir estas grandes cantidades de información, no hay mejor comando que RSYNC, también se puede usar scp pero este no dispone de subidas incrementales ni es capaz de restaurar la subida anterior lo que deja a scp a muy poca altura de RSYNC.

rsync -Pav /carpeta/origen/ usuario@servidor:/carpeta/destino/

Esto subirá todos los archivos de la carpeta origen la de destino en un servidor por ssh, si necesitamos utilizar un keypair como es habitual en la mayoría de los servidores Cloud, lo utilizaremos de la siguiente forma:

rsync -Pav -e «ssh /ruta/keypair.pem» /carpeta/origen/ usuario@servidor:/carpeta/destino/
Es básicamente lo mismo solo que con -e le indicamos donde tiene que ir a buscar el fichero keypair en nuestro ordenador local.

Sustituir o reemplazar texto en ficheros grandes

Esto es otra de las cosas que nos veremos obligados a hacer muy a menudo, dependiendo del fichero y del tamaño de este podremos abrirlo con un editor de texto y hacer un replace de la cadena que queramos reemplazar, pero al trabajar con archivos tan grandes, casi ningún editor de texto sera capaz de abrir nuestros ficheros.

Para solucionar esto disponemos del comando SED, que es otro de los imprescindibles a la hora de trabajar con esta gran cantidad de datos.

sed ‘s/cadena-a-buscar/cadena-que-reemplazara-la-buscada/’ fichero.txt

Es tan fácil que no merece muchos comentarios, solo decir que puede tardar un poco en actuar pero su efectividad es impresionante.

 

Esto no pretende ser una biblia sobre el parseo y la utilización de ficheros grandes, simplemente es una pequeña guía, creada para arrojar un poco de luz a los que se están iniciando en este mundillo.

2 comentarios en «Cortar y parsear ficheros de tamaño grandes»

  1. Aquí te dejo un comando con el que podrás dividir un fichero de gran tamaño en csv en trozos pequeños con la misma estructura y cabecera.

    cat fichero_muy_grande.csv | parallel –header : –pipe -N1000000 ‘cat > porcion_del_fichero_numero_{#}.csv’

    Si luego vas a insertar poco a poco los ficheros que has cortado en trozos es importante que todos ellos contengan la cabecera.
    Saludos.

    Responder

Deja un comentario