Estoy procesando algunos archivos de texto para buscar patrones y contarlos. Como los archivos son muy grandes, el tiempo de procesamiento es un tema importante. Tengo un código de Python que actualiza y almacena los contadores en mongodb. Para que funcione más rápido, estoy tratando de reducir el número de operaciones db.

La versión original estaba incrementando cada aparición:

mlcol.find_one_and_update(
    {"connip": conip}, 
    {"$inc":{ts:1}}, 
    upsert=True
)

Como esto llevó mucho tiempo, lo que hice fue mantener los contadores en la memoria, en los diccionarios y revisar periódicamente estos datos para almacenarlos:

for conip in conCounter.keys():
    d = conCounter[conip]
    for ts in d.keys():
        mlcol.find_one_and_update(
            {"connip": conip}, 
            {"$inc":{ts:d[ts]}}, 
            upsert=True
        )

De esta manera, el proceso es mucho más rápido, pero veo que todavía lleva mucho tiempo actualizar individualmente cada contador.

¿Hay alguna manera de iniciar varias actualizaciones en un solo comando?

¿Alguna otra idea para hacer que esto vaya más rápido?

0
jordi 1 jul. 2019 a las 11:26

1 respuesta

La mejor respuesta

Como explicó Alex Blex, la creación de un índice y una ejecución masiva resolvió el problema:

mlcol.create_index("connip")


bulk=mlcol.initialize_unordered_bulk_op()
for conip in conCounter.keys():
    d = conCounter[conip]
    for ts in d.keys():
        bulk.find({"connip": conip}).upsert().update({"$inc":{ts:d[ts]}})
res=bulk.execute()
0
jordi 2 jul. 2019 a las 07:37