sql >> Base de Datos >  >> NoSQL >> MongoDB

Reduzca la memoria utilizada cargando un enorme marco de datos de pandas desde MongoDB

Lo que está en un CSV y lo que está en un marco de datos son dos cosas muy diferentes. Por ejemplo, 9.9 y 9.99999999999999 en un CSV ocupará la misma cantidad de espacio en un marco de datos.

Dicho esto, los datos en un marco de datos ocupan mucho menos espacio que los datos en una lista. Construir una lista es costoso en memoria; y agregar a un marco de datos requiere que los pandas creen un marco de datos nuevo (más grande), copie todo y luego deje que el marco de datos original se recolecte como basura.

Probablemente lo haría mucho mejor si preasignara un marco de datos de 60000 filas (o la cantidad de filas que tenga en total); por ejemplo:

data = pd.DataFrame(np.empty((60000,), dtype=[
    ('x', np.uint8),
    ('y', np.float64)
]))

y luego, para cada fila, datos insertados para esa fila, sin depender de dataset lista:

data.values[count,:] = rowdata_at_count

Esto no es de tipo seguro, pero es bastante rápido (ya que no se realizan asignaciones), así que asegúrese de que rowdata_at_count es una lista cuyos elementos se corresponden con los tipos de columna.

EDITAR

Sí, agregar 100 líneas es, creo, como 100 concats de una línea (ya que cada agregado debe reasignar y copiar la tabla, al igual que concat). La preasignación evita agregar y concatenar:el tamaño de la tabla no cambia, no es necesario reasignar ni copiar.