2012-03-20 10 views
7

Necesito leer toda la colección de MongoDB (el nombre de la colección es "prueba") en el código de Python. Probé como¿Cómo leer la colección en trozos por 1000?

self.__connection__ = Connection('localhost',27017) 
    dbh = self.__connection__['test_db']    
    collection = dbh['test'] 

Cómo leer a través de la colección en trozos antes de 1000 (para evitar desbordamiento de la memoria porque la recolección puede ser muy grande)?

Respuesta

5

Use los cursores. Los cursores tienen una variable "batchSize" que controla cuántos documentos se envían realmente al cliente por lote después de realizar una consulta. No es necesario que toque esta configuración, ya que el valor predeterminado es correcto y la complejidad de invocar comandos "getmore" está oculta en la mayoría de los controladores. No estoy familiarizado con pymongo pero funciona de esta manera:

cursor = db.col.find() // Get everything! 

while(cursor.hasNext()) { 
    /* This will use the documents already fetched and if it runs out of documents in it's local batch it will fetch another X of them from the server (where X is batchSize). */ 
    document = cursor.next(); 

    // Do your magic here 
} 
+1

¿Cómo se hace esto en Python? –

5

Estoy de acuerdo con Remón, pero menciono lotes de 1000, que su respuesta en realidad no cubre. Se puede establecer un tamaño de lote en el cursor:

cursor.batch_size(1000); 

También se puede saltar los registros, por ejemplo .:

cursor.skip(4000); 

Es esto lo que está buscando? Esto es efectivamente un patrón de paginación. Sin embargo, si solo está tratando de evitar el agotamiento de la memoria, entonces realmente no necesita establecer el tamaño del lote o saltear.

0

Al crear la conexión inicial actualmente en Python 2 usando Pymongo:

host = 'localhost' 
port = 27017 
db_name = 'test_db' 
collection_name = 'test' 

Para realizar la conexión con MongoClient

# Connect to MongoDB 
client = MongoClient(host=host, port=port) 
# Make a query to the specific DB and Collection 
dbh = client[dbname] 
collection = dbh[collection_name] 

Así que desde aquí la respuesta correcta. Quiero leer usando fragmentos (en este caso, de tamaño 1000).

chunksize = 1000 

Por ejemplo, podríamos decidir cuántos trozos de tamaño (tamaño de trozo) queremos.

# Some variables to create the chunks 
skips_variable = range(0, db_aux[collection].find(query).count(), int(chunksize)) 
if len(skips_variable)<=1: 
    skips_variable = [0,len(skips_variable)] 

Luego podemos recuperar cada trozo.

for i in range(1,len(skips_variable)): 

    # Expand the cursor and retrieve data 

    data_from_chunk = dbh[collection_name].find(query)[skips_variable[i-1]:skips_variable[i]])) 

Donde la consulta en este caso es query = {}.

Here Uso ideas similares para crear marcos de datos de MongoDB. Here Uso algo similar para escribir en MongoDB en trozos.

Espero que ayude.

Cuestiones relacionadas