Comparar líneas de archivos muy grandes
Publicado: 2012-09-10 16:49 @742
Hola de nuevo, perleros.
Tengo una duda muy básica.
Tengo que comparar dos archivos inmensos (16GB, aproximadamente, cada uno) con cada una de sus líneas separadas por columnas. Lo que quiero es comprobar si cada valor de la primera columna de cada línea está en el segundo archivo, y de "NO" ser así que me imprima en un tercer archivo esa línea completa.
Teniendo archivos pequeños, es sencillísimo de resolver: Meto en un hash el valor del primer archivo y con un bucle en el segundo archivo compruebo si existe esa llave/valor.
El problema, como ya os he dicho, es que la RAM no me da para meter en un hash un archivo entero (bueno, solo la primera columna). Cuando corro el script al rato el ordenador se ralentiza muchísimo y directamente se congela todo, incluyendo el ratón. Que me quedo sin memoria, vamos.
Buscando en el foro el usuario "salva" decía;
El problema es que ambos archivos no tienen por qué contener el mismo número de líneas, ni en cada línea tiene que haber los mismo campos. Quiero decir que no entiendo cómo podría ayudarme a extraer las líneas únicas de uno de los archivos ordenando ambos.
Por ejemplo. Archivo 1:
Archivo 2:
El archivo que yo busco sería:
Pero siguiendo la solución de "sortear":
Archivo 1 ordenado:
Archivo 2 ordenado:
Si comparo línea a línea cada archivo "sorteado" obtendría un archivo vacío.
Tengo una duda muy básica.
Tengo que comparar dos archivos inmensos (16GB, aproximadamente, cada uno) con cada una de sus líneas separadas por columnas. Lo que quiero es comprobar si cada valor de la primera columna de cada línea está en el segundo archivo, y de "NO" ser así que me imprima en un tercer archivo esa línea completa.
Teniendo archivos pequeños, es sencillísimo de resolver: Meto en un hash el valor del primer archivo y con un bucle en el segundo archivo compruebo si existe esa llave/valor.
El problema, como ya os he dicho, es que la RAM no me da para meter en un hash un archivo entero (bueno, solo la primera columna). Cuando corro el script al rato el ordenador se ralentiza muchísimo y directamente se congela todo, incluyendo el ratón. Que me quedo sin memoria, vamos.
Buscando en el foro el usuario "salva" decía;
salva escribiste:Como te comenta explorer, si tienes memoria suficiente para leer el archivo pequeño en un hash, esa es la solución más fácil y rápida.
Si no, la solución clásica a este problema es ordenar los dos ficheros en disco por el campo clave (usando la utilidad sort o el módulo Sort::External, por ejemplo) para luego leer los dos ficheros ordenados en paralelo buscando coincidencias.
El problema es que ambos archivos no tienen por qué contener el mismo número de líneas, ni en cada línea tiene que haber los mismo campos. Quiero decir que no entiendo cómo podría ayudarme a extraer las líneas únicas de uno de los archivos ordenando ambos.
Por ejemplo. Archivo 1:
Using text Syntax Highlighting
Archivo 2:
Using text Syntax Highlighting
El archivo que yo busco sería:
Using text Syntax Highlighting
Oswaldo 56
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
Pero siguiendo la solución de "sortear":
Archivo 1 ordenado:
Using text Syntax Highlighting
Archivo 2 ordenado:
Using text Syntax Highlighting
Si comparo línea a línea cada archivo "sorteado" obtendría un archivo vacío.