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?