¿Cuál es la forma más eficiente de clasificar 4 TB en una sola máquina con 4 GB de RAM?

Voto por un tipo de combinación externa que utiliza un tipo rápido local en memoria.

Este enfoque supone que el ordenamiento no necesita hacerse “en el lugar”. También supone que el almacén externo (como un disco duro) hace un acceso secuencial más rápido que el acceso aleatorio (por ejemplo, leer pistas enteras en orden de pista).

1. Divida los 4 TB en 1000 conjuntos de datos de 4 GB.
2. Cargue, clasifique rápidamente y escriba cada conjunto de datos de 4 GB.
3. Combine los 1000 conjuntos de datos en una sola pasada, escribiendo en una nueva tienda a medida que avanza.

El paso 2 implicará una lectura secuencial completa y una escritura secuencial completa del conjunto completo de datos de 4 TB. Los pasos rápidos serán “instantáneos” en relación con el tiempo de lectura-escritura de la tienda externa.

El paso 3 incluirá una lectura semisecuencial completa y una escritura secuencial completa de los 4 TB. La lectura es semisecuencial ya que los bloques completos se pueden leer y procesar a la vez, pero las 1000 listas deben leerse en paralelo, lo que está cerca del acceso aleatorio. Para ser inteligente al respecto, se pueden leer 1000 bloques secuenciales separados de 4 MB para aumentar la cantidad de lectura secuencial. O, de manera más inteligente, mantenga 1000 memorias intermedias de lectura de 4 MB separadas en la memoria y llénelas estratégicamente a medida que se agoten utilizando un algoritmo de acceso al disco del elevador.

Este algoritmo funcionará> 2 veces más rápido si se usan dos discos duros en lugar de uno. La razón es que con dos discos, la lectura y la escritura pueden ocurrir en paralelo mientras se reduce sustancialmente el “golpeteo” del recorrido de la cabeza de pista a pista.

Podemos usar una ordenación de fusión externa para ordenar eficientemente grandes conjuntos de datos cuando tenemos restricciones de memoria.
En este caso particular.

  1. Divida el conjunto de datos de 4 TB en fragmentos de 4 GB.
  2. Lea cada fragmento de 4 GB en la memoria uno a la vez y ordénelo utilizando un algoritmo de clasificación convencional, como Quicksort. Escriba cada fragmento ordenado nuevamente en el disco.
  3. Lea los primeros 200 MB de cada fragmento clasificado de 4 GB en la memoria. Estos serán nuestros amortiguadores de entrada. Totalmente, todos los fragmentos de 200 MB ocuparán 2 GB de memoria.
  4. Los 2 GB restantes de memoria serán nuestro búfer de salida.
  5. Realizamos una fusión n-way en los fragmentos de 200 MB y almacenamos el resultado en nuestro búfer de salida.
  6. Cuando nuestro buffer de salida se llena, lo escribimos en el disco.
  7. Cuando un búfer de entrada de 200 MB se vacía, leemos los siguientes 200 MB de la parte restante del fragmento original de 4 GB.
  8. Cuando hemos agotado todos nuestros fragmentos de 4 GB y todos los búferes de entrada de 200 MB, escribimos el búfer de salida de 2 GB por última vez en el disco y ahora deberíamos tener un conjunto de datos de 4 TB ordenados.

src: clasificación externa

Creo que debería leer mi respuesta a la siguiente pregunta: ¿Cuál sería un algoritmo eficiente para ordenar millones de líneas de cadenas / enteros en un archivo?

En cualquier caso, como parte de esa respuesta, si solo tiene un tipo de datos, creo que el algoritmo más adecuado es el mergesort externo, utilizando la selección de reemplazo de dos vías como el algoritmo de clasificación de ejecución. Esto ha demostrado ser el más eficiente en términos de crear las ejecuciones más grandes, sin importar las características de los datos, lo que reduce el ventilador para el tipo de fusión.

More Interesting

Dado un conjunto entero tal que cada elemento ocurre 3 veces, excepto un elemento, que ocurre solo una vez, ¿cómo encuentro ese único elemento en el espacio O (1) y en la complejidad del tiempo O (n)?

Cómo construir un algoritmo para operar

¿Debo hacer investigación de pregrado en estructuras de datos teóricos y algoritmos, incluso si todavía no estoy seguro de si estoy persiguiendo la industria o la academia?

¿Cuáles son los algoritmos que se pueden usar en R para la predicción de datos categóricos?

¿Debería alguien que se aplica a un campo de arranque de desarrollo ya saber cómo escribir una función para sumar una matriz multidimensional?

¿Es mejor hacer InterviewBit ahora (actualmente estoy en mi quinto semestre) o hacer SPOJ ahora y luego hacer InterviewBit solo 3 o 4 meses antes de las entrevistas? Solo conozco algunas estructuras de datos y algoritmos básicos. He hecho 40 problemas en SPOJ.

¿Es este un algoritmo correcto para verificar si un árbol es una búsqueda binaria?

¿Hay alguna guía sobre el uso de datos sintéticos para entrenar algoritmos de visión por computadora? ¿Hay alguna investigación al respecto?

¿Qué estructura de datos se usa para llenar una pila?

¿Cómo mejoro mis habilidades informáticas? ¿Alguien puede recomendarme formas de acortar la curva de aprendizaje?

¿Dónde puedo encontrar un entrenador de programación personal que me enseñe programación y algoritmos?

¿Cómo funciona la detección de vandalismo de Wikipedia?

¿Cuál es la aplicación del problema N-Queens en el mundo real? ¿Es aplicable en problemas de localización o enrutamiento?

¿Es posible aplicar de manera eficiente algoritmos de aprendizaje automático para problemas de optimización combinatoria?

¿Cuál es el mejor algoritmo de programación que hayas creado?