Tengo una PC con Intel (R) Pentium (R) CPU G640 @ 2.80 GHz y 8 GB de RAM. Estoy ejecutando Scientific Linux 6.5 con el sistema de archivos EXT3.
En esta configuración, ¿cuál es la forma más rápida que puedo hacer sort -u
en un archivo de 200 gigabytes?
¿Debería dividir el archivo en archivos más pequeños (más pequeños que 8 GB), sort -u
juntarlos y luego dividirlos nuevamente en un tamaño diferente, sort -u
nuevamente, etc.? ¿O hay algún script de clasificación, programas que puedan manejar archivos tan grandes con mi cantidad limitada de RAM?
/tmp
.parallel
para esto, creo, en lugar de las más utilidadesparallel
que se instalan por defecto en algunos sistemas.sort(1)
podría quedarse sin espacio en/tmp
; si es así, puede designar otra área para archivos temporales con la variable de entornoTMPDIR
, o marcar-T=<tmpdir>
Respuestas:
GNU
sort
(que es el predeterminado en la mayoría de los sistemas Linux), tiene una--parallel
opción. De http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html :Como su CPU tiene 2 núcleos, puede hacer:
Es mejor especificar el número real de núcleos, ya que puede parecer que hay más debido a que el procesador tiene hiperprocesamiento .
También puede experimentar
nice
para influir en la prioridad de programación del procesador eionice
influir en la programación de E / S. Puede aumentar la prioridad sobre otros procesos como este, no creo que esto le brinde grandes ahorros, ya que generalmente son mejores para asegurarse de que un proceso en segundo plano no use demasiados recursos. Sin embargo, puede combinarlos con algo como:Tenga en cuenta también que, como comentó Gilles , usar un solo comando de clasificación GNU será más rápido que cualquier otro método para desglosar la clasificación ya que el algoritmo ya está optimizado para manejar archivos grandes. Cualquier otra cosa probablemente ralentizará las cosas.
fuente
sort
directamente es mejor que cualquier otra cosa que pueda improvisar. GNU sort está diseñado para hacer frente a archivos que son mucho más grandes que la RAM.Usar el
sort
comando probablemente será la opción más rápida.Pero probablemente querrás arreglar la configuración regional en C.
sort -u
no informa líneas únicas, sino una de cada conjunto de líneas que las clasifican de la misma manera. En la configuración regional C, 2 líneas diferentes no necesariamente ordenan lo mismo, pero ese no es el caso en la mayoría de las configuraciones regionales basadas en UTF-8 en sistemas GNU.Además, el uso de la configuración regional C evita la sobrecarga de tener que analizar UTF-8 y procesar órdenes de clasificación complejas, por lo que mejoraría drásticamente el rendimiento.
Asi que:
También puede mejorar el rendimiento utilizando una unidad más rápida (o una unidad diferente de aquella en la que se encuentran los archivos de entrada y / o salida) para los archivos temporales (usando
-T
o$TMPDIR
variable de entorno), o jugando con la-S
opción admitida por algunassort
implementaciones) .Para algún tipo de entrada o para almacenamiento lento, el uso de la
--compress-program
opción de GNUsort
(por ejemplo conlzop
) podría mejorar el rendimiento además del uso de almacenamiento.fuente
Aquí hay un script bash listo para usar para ordenar los datos de escala de TB en una máquina normal con un par de RAM de RAM: http://sgolconda.blogspot.com/2015/11/sort-very-large-dataset.html Comprueba el número de núcleo de su máquina como y utiliza todos los núcleos. Puede ordenar archivos numéricos o de cadena. Se puede utilizar para buscar registros únicos en datos de escala TB.
fuente