Cómo manejar unos 8 millones de tweets (17 GB) para un paso de preprocesamiento

Aquí hay realmente dos pasos diferentes que probablemente tengan dos respuestas diferentes. Así que vamos a dividir esto en el bit ‘preproceso’ y el bit ‘aprendizaje automático’.

Preproceso : hay dos formas de desollar este gato. 1) Acelere su método actual en su hardware actual y 2) Muévase a un marco distribuido.

  • Hazlo más rápido : puedes perfilar tu código actual y descubrir cuál es la restricción actualmente. Podría ser CPU, podría ser disco IO. Si es CPU, entonces puede reescribir el código para que sea paralelo (use múltiples hilos) en su hardware existente. Si está vinculado a IO, puede pasar a una unidad SSD. O simplemente podría lanzar hardware más rápido en forma de una instancia de Amazon EC2 muy eficiente. Las soluciones antes mencionadas no requieren reescribir su código de preprocesamiento existente. Otro enfoque sería reescribir su código de preprocesamiento en un idioma más rápido. Aprender un nuevo idioma conlleva un gran costo fijo, por lo que lo ofreceré como una solución, sabiendo que a menudo esa no es una solución razonable.
  • Vaya distribuido : el preprocesamiento de datos es un buen ejemplo de algo que es trivialmente distribuible. Puede cortar su archivo de entrada en mandriles, agréguelos a un grupo de trabajadores y luego recombinar los bits resultantes. Realmente no necesita un marco pesado como Hadoop para hacer esto, pero podría hacerlo. Soy un fanático de los servicios fáciles de usar, por lo que me inclinaría a usar Elastic Map Reduce (EMR) de Amazon para hacer el preprocesamiento. Dependiendo del idioma en el que escribió su código existente, es posible que solo necesite modificaciones menores en el código.

Aprendizaje automático : los principios son los mismos que en el paso de preprocesamiento. Tienes que obtener hardware más rápido, código más rápido o distribuirte. Parece que ha habido algún trabajo para hacer que LDA sea escalable, pero no tengo un conocimiento profundo, personalmente: http://bcmi.sjtu.edu.cn/~zhzhang…

Supongo que Apache Solr puede serle útil. Procesamos 400GB de datos usando solr. Primero indexamos datos usando solr, después de eso para cada oración de entrada realizamos la tarea “Corrección de oración” usando estos datos indexados. Por cada pequeña oración que alcancemos alrededor de 16-20 o más en solr, obtenga la frecuencia de las palabras (ngrams) y sugerencias de solr y aplique un proceso complicado en ella. Este proceso finaliza en 2-3 segundos. El tiempo que lleva indexar 400 gb de datos es de casi 7 horas en un servidor azul con 32 GB de RAM y usando un solo fragmento en solr.

  • Primero indexa los datos de tuits en solr
  • Obtener tweets de solr basados ​​en la identificación de tweet
  • realizar el proceso de limpieza
  • Realice la indexación de los documentos que desea utilizar para LDA (Solr tiene una funcionalidad incorporada para tf / idf y cálculo de frecuencia de palabras que podrían ayudarlo además)
  • Aplicar LDA
  • almacenar el resultado de nuevo a solr

En solr puede crear diferentes fragmentos y distribuir el procesamiento a través de diferentes nodos, lo que puede procesar más rápido.

Dado que los datos que tiene son bastante grandes, no tanto en GB como en la cantidad de cosas que deben hacerse, le aconsejaría cambiar los engranajes a un algoritmo de computación distribuida, como el uso de Apache Hadoop o Apache Spark. Sin embargo, involucrarlos requiere escribir un algoritmo de MapReduce y conocimiento previo o Java / Python o incluso Scala en el caso de Spark. Si conoce alguno de estos, pase a estas plataformas y su tiempo total se reducirá drásticamente en función de la cantidad de nodos que utilice para funcionar.

En caso de que no conozca ninguno de estos, intente usar subprocesos múltiples. Este módulo está disponible en casi todos los lenguajes de programación. Sin embargo, para seguir adelante, es posible que deba distribuir tweets en diferentes archivos, como File1: 0-1 millones de tweets, etc. Usar un trhread definitivamente ayudaría a reducir el tiempo. Pero asegúrese de no terminar usando demasiados hilos ya que todas las operaciones sucederían simultáneamente en la RAM, y su programa mostrará un error: SIN MEMORIA.

En resumen, si conoce los algos de MapReduce, considere usar Hadoop o Spark.
De lo contrario, use el subproceso múltiple en cualquier lenguaje de programación que desee. Distribuya datos en diferentes archivos (idealmente la cantidad de hilos que va a ejecutar). Para cada uno de estos hilos, puede definir la lógica.

Código de subprocesamiento de muestra en Python

#! / usr / bin / python
hilo de importación
tiempo de importación
# Definir una función para el hilo
def print_time (threadName, delay):
cuenta = 0
mientras cuenta <5:
time.sleep (retraso)
cuenta + = 1
print “% s:% s”% (threadName, time.ctime (time.time ()))
# Crear dos hilos de la siguiente manera
intente: thread.start_new_thread (print_time, (“Thread-1”, 2,)) thread.start_new_thread (print_time, (“Thread-2”, 4,))
excepto:
imprime “Error: no se puede iniciar el hilo” mientras 1: pasa

Cuando se ejecuta el código anterior, produce el siguiente resultado:

Hilo-1: Dom 24 de mayo 1:32:19 2014 Hilo-1: Dom 24 de mayo 1:32:19 2014
Hilo-2: Dom 24 de mayo 1:32:20 2014 Hilo-1: TSun 24 de mayo 1:32:20 2014
Hilo-2: Dom 24 de mayo 1:32:21 2014 Hilo-1: Dom 24 de mayo 1:32:21 2014
Hilo-1: Dom 24 de mayo 1:32:22 2014 Hilo-2: Dom 24 de mayo 1:32:22 2014
Hilo-2: Dom 24 de mayo 1:32:22 2014 Hilo-2: Dom 24 de mayo 1:32:22 2014

¿Qué quieres lograr en última instancia? Extracción del tema?
Eche un vistazo a nuestro twistiller: Twistiller Feeds – CorticalIO Demo
cortical.io está utilizando un algoritmo independiente del lenguaje, basado en neurociencia (en lugar de estadística).
velocidad del rayo…

No soy competente en este tema, pero puedo sugerir algunas cosas. Matlab y R quizás te ayuden. Porque estas herramientas pueden manejar archivos grandes y se especializan en estadísticas y análisis.
Puede comenzar aquí Vista de tareas CRAN: Alto rendimiento y computación paralela con R

Le sugiero que alquile un servidor con 50 GB de RAM y procese sus datos o realice el aprendizaje automático con un simple script de Python.

17 GB caben en la memoria de una sola máquina y realmente no debería distribuirse.

Creo que GENSIM se adapta a tus necesidades
https://radimrehurek.com/gensim/