tutorial read index español documentacion python pandas multiprocessing

read - pandas python tutorial español pdf



multiproceso en python: compartir objetos grandes(por ejemplo, pandas dataframe) entre múltiples procesos (1)

El primer argumento para Value es typecode_or_type . Eso se define como:

typecode_or_type determina el tipo de objeto devuelto: es un tipo de tipo ctypes o un tipo de letra de un tipo del tipo utilizado por el módulo de conjunto. * args se pasa al constructor para el tipo.

Énfasis mío Entonces, simplemente no puedes poner un marco de datos de pandas en un Value , tiene que ser del tipo de tipo ctypes .

En su lugar, podría utilizar un multiprocessing.Manager Administrador para servir su instancia singleton de marco de datos a todos sus procesos. Hay algunas maneras diferentes de terminar en el mismo lugar; probablemente, lo más fácil sea colocar su dataframe en el Namespace de Namespace del administrador.

from multiprocessing import Manager mgr = Manager() ns = mgr.Namespace() ns.df = my_dataframe # now just give your processes access to ns, i.e. most simply # p = Process(target=worker, args=(ns, work_unit))

Ahora su instancia de marco de datos es accesible para cualquier proceso que reciba una referencia al Administrador. O simplemente pasa una referencia al Namespace , es más limpio.

Una cosa que no he cubierto / no cubriré son los eventos y la señalización: si tus procesos necesitan esperar a que otros finalicen la ejecución, deberás agregarlos. Aquí hay una página con algunos ejemplos de Event que también cubren con un Más detalles sobre cómo usar el Namespace de Namespace del administrador.

(tenga en cuenta que nada de esto aborda si el multiprocessing va a generar beneficios de rendimiento tangibles, esto es solo darle las herramientas para explorar esa cuestión)

Estoy usando el multiproceso de Python, más precisamente

from multiprocessing import Pool p = Pool(15) args = [(df, config1), (df, config2), ...] #list of args - df is the same object in each tuple res = p.map_async(func, args) #func is some arbitrary function p.close() p.join()

Este enfoque tiene un gran consumo de memoria; comiendo casi toda mi memoria RAM (en ese punto se vuelve extremadamente lento, lo que hace que el multiprocesamiento sea bastante inútil). Supongo que el problema es que df es un objeto enorme (un gran marco de datos de pandas) y se copia para cada proceso. He intentado usar multiprocessing.Value Valor para compartir el marco de datos sin copiar

shared_df = multiprocessing.Value(pandas.DataFrame, df) args = [(shared_df, config1), (shared_df, config2), ...]

(como se sugiere en la memoria compartida de multiprocesamiento de Python ), pero eso me da TypeError: this type has no size (¿como compartir un objeto complejo entre procesos de Python?, a lo que desafortunadamente no entiendo la respuesta).

Estoy usando multiprocesamiento por primera vez y tal vez mi comprensión no es (todavía) lo suficientemente buena. ¿ multiprocessing.Value es realmente multiprocessing.Value incluso para usar en este caso? He visto otras sugerencias (por ejemplo, cola) pero estoy un poco confundido. ¿Qué opciones hay para compartir memoria y cuál sería la mejor en este caso?