¿Cómo lidiamos con conjuntos de datos muy grandes que no caben en la RAM?

Abordemos esto desde un lado práctico. Tuve un desafío similar cuando estaba trabajando en proyectos de ciencia de datos con R.

En uno de los casos, el conjunto de datos era un conjunto de datos de Oracle con datos de pruebas de pozos de producción de pozos de petróleo y gas. La base de datos Oracle era demasiado grande para ser leída en la memoria; mi computadora tenía 8 GB de RAM y el archivo tenía alrededor de 800 GB. Lo que hice en este caso fue dividir el archivo por un aspecto: elegí el tiempo en mi caso, específicamente los años. Luego, seleccioné el año, digamos 2011, y procedí a exportarlo como .csv. Lo intenté primero como formato Excel, pero el agente de exportación de Oracle se bloqueó. Después de terminar de exportar ese año, pasa al siguiente, y así sucesivamente. En su caso, es posible que desee elegir otra dimensión de datos , como campo, unidad de negocios, ubicación, etc. Tendrá que ser algo que ayude a dividir el conjunto de datos en archivos más pequeños. Este método tiene el inconveniente de que no le faltarán algunos datos que llegan en tiempo real . Si el análisis en tiempo real no es un problema, este método de división debería estar bien. Al menos funcionó para mí. Luego, de vuelta a la consola R, puede continuar el trabajo de extraer las partes de los datos que puede utilizar. Eso ayudará a que el conjunto de datos sea aún más pequeño.

En el segundo caso, los archivos del conjunto de datos eran archivos CSV remotos, lo suficientemente grandes como para no poder manejarlos en R en mi computadora portátil. Tengo un HP ZBook con 8 núcleos y 32 Gb de RAM. En mi beneficio, realmente no necesitaba todo el contenido del archivo ; Necesitaba un rango específico de fechas. El conjunto de datos contenía varios años de datos. Si busca en Internet, encontrará que existen varias técnicas para obtener grandes conjuntos de datos. Primero, necesita echar un vistazo a la estructura del conjunto de datos, lo que podría hacer solo descargando las primeras líneas del archivo: el encabezado con los nombres de las variables o columnas. Luego, para las filas u observaciones, envía consultas para tomar la parte superior, la parte inferior del conjunto de datos y en algún lugar en el medio que le dé una idea del rango. Una vez que identifica su área dulce, procede a enviar la consulta para el período que necesita y extrae las filas. Como dije, hay varias estrategias para hacer esto en R. Como probablemente ya haya notado, R siempre tiene varias formas de vencer los desafíos, no solo una.

En el tercer caso, se trataba de una base de datos SQLite que ralentizaba la consola R cada vez que se cargaba. De manera muy similar al primer caso, podría dividir el conjunto de datos en partes más pequeñas. Pero este caso fue diferente porque quería los últimos datos . Por lo tanto, utiliza una combinación del método uno y escribe un script que toma los datos todos los días o todas las semanas, pero de tal manera que parchea el conjunto de datos principal y no obtiene lagunas de datos. El script se puede hacer desde su lado local en R, conectarse al servidor, seleccionar los datos y guardarlos localmente. Una segunda alternativa es escribir código en el propio servidor que le enviará a través de ftp o correo electrónico pequeños fragmentos de datos en momentos predeterminados.

En un cuarto caso, un cliente me dio un enorme archivo de base de datos de un servidor MS SQL . No hay posibilidad de que pueda leerlo desde la consola R. Esta era una base de datos de producción de pozos en alta mar en el Golfo de México . Un montón de datos. Zona por zona, capa por capa, plataforma por plataforma. Lo que hice en ese caso fue crear una máquina virtual que actuaría como un servidor de base de datos . Como su propósito no es servir la base de datos a los usuarios, sino explorar los datos para hacer sus descubrimientos, es suficiente descargar e instalar una versión Express del servidor SQL. Eso sería suficiente: no necesita soporte para múltiples CPU o RAM gigantesca si no está en producción. Una vez que tenga su servidor SQL en línea y probado , simplemente use un conector SQL de R a la base de datos y proceda a hacer sus consultas SQL. En este punto, difícil, depende de usted cómo desea interrogar a la base de datos, si es con SQL o con sentencias lógicas R estándar. Probablemente tenga que averiguar cuál es la herramienta de manipulación de marcos de datos más rápida: dplyr o data.table o SQL directo. Si busca en StackOverflow , podrá encontrar scripts de evaluación comparativa en R que hacen exactamente eso. A veces, la diferencia entre los métodos es menos de 10 veces y en otros, 1000 veces más rápido.

Mantenga al menos los índices en la RAM. Los índices son estructuras de datos que lo ayudan a encontrar rápidamente los datos que busca.

Un ejemplo del mundo real es el orden alfabético de los nombres en las guías telefónicas. Para buscar un nombre, comienza con la primera letra. Las guías telefónicas están divididas alfabéticamente y todos los nombres se clasifican en la parte con la letra con la que comienza el nombre. Luego hojeas la partición usando la segunda letra del nombre. Encuentras el nombre bastante rápido. No necesita leer toda la guía telefónica.

El truco es que tienes el alfabeto en tu cabeza. No necesita una hoja de referencia separada con las letras ABCDEF, etc. Esa es tu RAM!

Otro ejemplo del mundo real es la biblioteca con fichas. Los temas del libro se enumeran alfabéticamente y cada libro tiene una tarjeta de índice.

La imagen muestra un cajón de libros cuyos temas comienzan con A (por ejemplo, desde la forestación hasta Afganistán).

Aquí tenemos un índice de doble nivel. Primero en nuestra cabeza tenemos el alfabeto. Usamos eso para ubicar el cajón rápidamente. Si estábamos buscando un libro sobre forestación, podemos encontrar el cajón numerado 00220 rápidamente porque los cajones están ordenados alfabéticamente.

Luego usamos las tarjetas en el cajón para buscar un libro que pueda ser interesante. Este es el segundo índice. La tarjeta de índice luego nos dice dónde encontrar el libro.

La base de datos también podría estar doblemente indexada. Es importante que ambos índices estén en RAM, porque esto nos permite encontrar el registro rápidamente. Entonces es posible almacenar los datos en un almacenamiento más lento. Como en la biblioteca donde los libros podrían estar ubicados en un gran complejo subterráneo. Las personas solo buscan el libro en la sala de catálogo y luego le dan el número del libro al empleado que lo recoge por usted. Las bases de datos bien diseñadas funcionan de manera similar.

El ejemplo de la biblioteca también muestra el uso de múltiples índices muy bien. ¿Qué pasa si sabes el nombre del autor? Tiene sentido tener otro índice, el índice del autor.

Esto muestra que es importante diseñar la base de datos de manera que tenga índices para todas las búsquedas importantes y que todos los índices estén en RAM. Si sus índices crecen demasiado, entonces tiene un problema espinoso con una ponderación difícil de las preocupaciones (gastos versus ineficiencia).

Una solución es crear otro nivel de índices, como este: para todos los libros sobre forestación, tenga una tarjeta de índice que le indique que suba las escaleras a la fila del gabinete del catálogo. Esto ralentiza la recuperación porque necesita buscar en otro catálogo. Otra solución es ampliar la sala de catálogo mediante la construcción de un anexo a la biblioteca, es decir, ¡comprar más RAM!

Creo que hay dos ideas clave:

  1. Necesita almacenar datos muy grandes en sistemas especialmente diseñados para manejar grandes conjuntos de datos. Tales sistemas generalmente plantean un desafío de ingeniería considerable y, por lo general, necesitan un equipo dedicado de desarrolladores.
  2. Debe asegurarse de que R pueda hablar con esos sistemas. Idealmente, desea poder continuar escribiendo código R de la misma manera que trabaja con conjuntos de datos en memoria, pero que el sistema especializado realice el cálculo.

Esta es una de las motivaciones detrás de dplyr: le permite trabajar con sus datos donde vive, convirtiendo su código dplyr en SQL (como los motores de base de datos de código abierto incorporados), o los comandos spark (con sparklyr).

dplyr solo puede ser suficiente para resolver muchos problemas de big data, porque muchos problemas de big data son solo problemas de datos pequeños, una vez que tiene los datos pequeños correctos . Esto generalmente implica una combinación de subconjunto, submuestreo o resumen, y un montón completo de iteraciones. dplyr facilita la iteración porque puede permanecer en R, evitando el alto costo cognitivo de cambiar de idioma.

Hay problemas que no puede resolver con las herramientas actuales, pero creo que el marco básico (es decir, el mismo código funciona con datos en memoria y sin memoria) es realmente poderoso, y en el futuro veremos nuevos herramientas para ayudar con otras partes del proceso de ciencia de datos (particularmente visualización y modelado).

Apache Spark

Spark SQL / pyspark / Data Frames para manejar grandes conjuntos de datos usando spark. Es un módulo apache spark para trabajar con datos estructurados.

Hadoop

Apache Hadoop está diseñado básicamente para procesar grandes conjuntos de datos. HDFS es Hadoop Distributed File System. Este es el sistema de archivos predeterminado utilizado por el clúster de Hadoop. Para procesar un gran conjunto de datos.

Pitón

Blaze: el ecosistema de Blaze, una interfaz para consultar datos en diferentes sistemas de almacenamiento.

SFrame – Aprende y Pandas.

Programación R

tabla de datos()

marco de datos()

Agregando a respuestas anteriores. Hay muchas soluciones para almacenar y acceder a grandes cantidades de datos que puede encontrar fácilmente y que otros también han mencionado.

Para el análisis de datos y alimentar los datos a su modelo, puede usar Generadores.

No estoy seguro acerca de R, pero Python le proporciona las herramientas necesarias para crear generadores. Verifique https://wiki.python.org/moin/Gen

En cada llamada, una función de generador puede cargar cualquier cantidad de datos en la RAM y pasarla al modelo. Esto puede ayudarlo a evitar cargar todo el conjunto de datos a la vez, también mantendrá el estado de la llamada anterior guardada para que pueda volver a llamar y proporcione nuevos datos. Puede evitar la contabilidad y trabajar con cualquier tamaño de datos.

¡Espero eso ayude!

Mi respuesta será bastante diferente de las demás.

Primero, ¿realmente necesita analizar todo el conjunto de datos? En muchos casos, una submuestra aleatoria es suficiente.

En segundo lugar, si analiza el conjunto de datos completo, ¿los resultados serán razonablemente precisos? Por ejemplo, si hace PCA o SVD con una gran cantidad de características / variables, el error de redondeo acumulativo podría ser bastante grave. (Esto sigue siendo un problema incluso si la matriz original es escasa).

Tercero, en muchas aplicaciones se puede usar una técnica que llamo Software Alchemy. Google el término para más detalles.

Una respuesta fácil: busque una solución escalable para problemas de grandes conjuntos de datos.
Incluso con conjuntos de datos relativamente pequeños, si los cálculos (inversión de matrices, …) no se ajustan a su memoria, se verá obligado a utilizar la informática distribuida.

Si usa MATLAB, consulte las nuevas matrices altas que abordan este mismo problema.

More Interesting

¿Cuáles son las nuevas modificaciones en las redes neuronales recurrentes cuando se considera el aprendizaje profundo?

En una CNN, cuando la convolución se realiza entre 6 fuentes y 16 mapas como en LeNet, ¿cómo se hacen las convoluciones?

¿Qué tan similares son los problemas en los diversos campos del análisis de datos (aprendizaje automático, estadísticas, procesamiento de señales, optimización, teoría de la información, etc.)?

Cómo comenzar a aprender Neural Network y PNL

Cómo calcular la similitud de coseno

Cómo analizar páginas web a través de enlaces de Twitter

¿Dónde puedo encontrar guías de aprendizaje automático desde la perspectiva de los hackers?

¿Cuál es la guía genérica y la mejor guía para aprender TensorFlow desde la plataforma Python? ¿O hay otras bibliotecas mejores que TensorFlow?

¿Pueden proporcionarme un código para la predicción de palabras con word2vec?

¿Cuándo y por qué un clasificador Bayes ingenuo es una opción mejor / peor que un clasificador forestal aleatorio?

¿Por qué la longitud desigual del texto es un problema en el procesamiento del lenguaje natural?

¿Es demasiado tarde para sumergirme en Data Science, ya que se están desarrollando poderosas herramientas de aprendizaje automático y ya hay muchos científicos de datos hábiles?

¿Cuál es la mejor manera de administrar indicadores de función o alternar características para equipos de desarrollo más grandes?

¿Por qué Python es tan popular en el aprendizaje automático?

Si estuviéramos usando un SVM no lineal, ¿cuáles son los hiperparámetros? ¿Cómo elegiríamos los hiperparámetros correspondientes? (funciones de referencia utilizadas)