Tengo un archivo de texto con una palabra en cada línea, el tamaño del archivo es de 800 GB. Necesito ordenar las palabras alfabéticamente.
He intentado usar el programa de ordenación de Windows usando:
sort.exe input.txt /o output.txt
lo que da el error: No hay suficiente memoria principal para completar el ordenamiento.
Tengo 32 GB de RAM, así que cuando trato de especificar 10 GB de memoria para el tipo usando:
sort.exe input.txt /o output.txt /M 10000000
Yo obtengo:
Advertencia: el tamaño de memoria especificado se reduce a la memoria de paginación disponible.
El registro de entrada excede la longitud máxima. Especificar máximo más grande.
¿Cuáles son mis opciones?
Respuestas:
¿Cuáles son mis opciones?
Pruebe Freeware Command Line Sort Utility CMSort .
Utiliza varios archivos temporales y luego los combina al final.
Un usuario informa que ordenó un archivo de 130,000,000 bytes.
Si desea ajustar algún código usted mismo, también hay Ordenar archivos de texto enormes - CodeProject - "Algoritmo de líneas de clasificación en archivos de texto cuyo tamaño excede la memoria disponible"
fuente
--parallel
opción si tiene más de un núcleo ...)?Otra opción es cargar el archivo en una base de datos. EG MySQL y MySQL Workbench.
Las bases de datos son candidatas perfectas para trabajar con archivos grandes
Si su archivo de entrada contiene solo palabras separadas por una nueva línea, esto no debería ser demasiado difícil.
Después de haber instalado la base de datos y MySQL Workbench, esto es lo que debe hacer.
Primero cree el esquema (esto supone que las palabras no serán más largas que 255 caracteres, aunque podría alterar esto aumentando el valor del argumento). La primera columna "idwords" es una clave primaria.
En segundo lugar, importe los datos: EG Esto importará todas las palabras en la tabla (este paso puede tardar un tiempo en completarse. Mi consejo sería ejecutar primero una prueba con un pequeño archivo de palabras y una vez que esté seguro de que el formato es el mismo que el más grande (truncar la tabla. IE Borrarlo y cargar el conjunto de datos completo).
Este enlace puede ayudar a obtener el formato correcto para la carga. https://dev.mysql.com/doc/refman/5.7/en/load-data.html
EG Si necesita omitir la primera línea, haría lo siguiente.
Finalmente guarde el archivo ordenado. Esto puede tomar un tiempo también dependiendo de su PC.
También puede buscar los datos a voluntad como lo desee. EG Esto le dará las primeras 50 palabras en orden ascendente (comenzando desde la 0 o primera palabra).
Buena suerte
pete
fuente
mywords
tomará una eternidad. Incluso con elLIMIT
, tomará tanto tiempo como todo porque MySQL tendrá que pasar por cada valormywords
y ordenarlos. Para solucionar esto, debe hacer lo siguiente después de haberlo hechoLOAD DATA
. Agregue un índice amywords
. Ahora puede ordenar por esa columna y no hacer que tome un milenio. Y es mejor agregar el índice después de cargar los datos en lugar de cuando creó la tabla (carga de datos mucho más rápida).sort
Hay muchos algoritmos utilizados para ordenar los archivos ordenados y no ordenados [ 1 ] .
Como todos esos algoritmos ya están implementados, elija un programa ya probado.
En coreutils (de Linux pero también disponible para Windows [ 2 ] ), existe el
sort
comando capaz de ejecutarse en paralelo bajo procesadores multi-core: generalmente es suficiente.Si su archivo es tan grande , puede ayudar al procesamiento de división (
split -l
), el archivo en algunos fragmentos, posiblemente utilizando la opción paralela (--parallel
), y ordenando los fragmentos ordenados resultantes con la-m
opción ( ordenar por fusión ). Aquíse explica una de las muchas formas de hacerlo (dividir archivos, ordenar fragmentos individuales, fusionar fragmentos ordenados, eliminar archivos temporales).
Notas:
(Por ejemplo, una clasificación de burbujas es el algoritmo más rápido para un archivo ya ordenado, exactamente N, pero no es eficiente en otros casos).
fuente
Para ofrecer una solución alternativa a Peter H, hay un programa q que permite comandos de estilo SQL contra archivos de texto. El siguiente comando haría lo mismo (ejecutar desde el símbolo del sistema en el mismo directorio que el archivo), sin necesidad de instalar SQL Workbench o crear tablas.
c1
es la abreviatura de la columna 1.Puede excluir palabras duplicadas con
y enviar la salida a otro archivo
fuente
Si las palabras en cada línea provienen de un vocabulario limitado (como el inglés), puede ordenar la lista en O (n + m log m) usando un TreeMap y registrando los recuentos (donde m es el número de valores únicos).
De lo contrario, puede utilizar el gran clasificador de la biblioteca java . Divide la entrada en archivos intermedios ordenados y los fusiona eficientemente (O general (nlogn)). Para ordenar su archivo se ve así:
Creé un archivo de 1.7GB (100m líneas) con palabras de 16 caracteres generadas aleatoriamente y las ordené como se indica arriba en 142s y en base a la complejidad computacional O (n log n) del método que estoy usando. Calculo que 800GB de palabras de 16 caracteres Tardo unas 24 horas en ordenar un solo subproceso en mi computadora portátil i5 2.3GHz con SSD.
fuente