for edition data 2nd python arrays numpy scipy bigdata

edition - Trabajando con Big Data en python y numpy, no hay suficiente RAM, ¿cómo guardar resultados parciales en el disco?



python for data analysis 2nd edition pdf (2)

Estoy tratando de implementar algoritmos para datos de 1000 dimensiones con 200k + puntos de datos en Python. Quiero usar numpy, scipy, sklearn, networkx y otras bibliotecas útiles. Quiero realizar operaciones como la distancia por pares entre todos los puntos y agrupar todos los puntos. He implementado algoritmos de trabajo que realizan lo que quiero con una complejidad razonable, pero cuando intento escalarlos a todos mis datos me quedo sin memoria RAM. Por supuesto que sí, creando la matriz para distancias pairwise en 200k + datos toma mucha memoria.

Aquí viene el truco: realmente me gustaría hacer esto en computadoras de mala calidad con poca cantidad de ram.

¿Hay alguna manera factible para mí de hacer que esto funcione sin las limitaciones del bajo ram? ¡Que tome mucho más tiempo realmente no es un problema, mientras el tiempo requerido no vaya al infinito!

Me gustaría poder poner en funcionamiento mis algoritmos y luego regresar una hora o cinco más tarde y no tenerlo bloqueado porque se quedó sin ram. Me gustaría implementar esto en python y poder usar las bibliotecas numpy, scipy, sklearn y networkx. Me gustaría poder calcular la distancia por pares a todos mis puntos, etc.

¿Es esto factible? Y cómo lo haré, ¿qué puedo comenzar a leer?

Saludos cordiales // Hipnotizador


Podría aumentar la memoria virtual en el sistema operativo y usar Python de 64 bits, siempre que sea un sistema operativo de 64 bits.


Utilizando numpy.memmap puedes crear matrices directamente mapeadas en un archivo:

import numpy a = numpy.memmap(''test.mymemmap'', dtype=''float32'', mode=''w+'', shape=(200000,1000)) # here you will see a 762MB file created in your working directory

Puede tratarlo como una matriz convencional: a + = 1000.

Es posible incluso asignar más matrices al mismo archivo, controlándolo de fuentes mutuas si es necesario. Pero he experimentado algunas cosas complicadas aquí. Para abrir la matriz completa, primero debe "cerrar" la anterior, usando del :

del a b = numpy.memmap(''test.mymemmap'', dtype=''float32'', mode=''r+'', shape=(200000,1000))

Pero al abrir solo una parte de la matriz, es posible lograr el control simultáneo:

b = numpy.memmap(''test.mymemmap'', dtype=''float32'', mode=''r+'', shape=(2,1000)) b[1,5] = 123456. print a[1,5] #123456.0

¡Estupendo! a fue cambiado junto con b . Y los cambios ya están escritos en el disco.

La otra cosa importante que vale la pena comentar es la offset . Supongamos que desea tomar no las primeras 2 líneas en b , sino las líneas 150000 y 150001.

b = numpy.memmap(''test.mymemmap'', dtype=''float32'', mode=''r+'', shape=(2,1000), offset=150000*1000*32/8) b[1,2] = 999999. print a[150001,2] #999999.0

Ahora puede acceder y actualizar cualquier parte de la matriz en operaciones simultáneas. Tenga en cuenta el tamaño de byte en el cálculo de desplazamiento. Entonces para un ''float64'' este ejemplo sería 150000 * 1000 * 64/8.

Otras referencias: