如何在多处理中使用熊猫

时间:2019-02-20 07:30:42

标签: python-3.x pandas multiprocessing

我正在开发一个用于处理大熊猫数据帧的脚本。当我尝试将multiprocessing.Poolreturn数据一起使用时,它会占用大量内存。 是否可以在不使用multiprocessing.Pool的情况下更改return内的数据帧。

例如,这里是工作代码,其中包含return数据:

import pandas as pd
import numpy as np
import multiprocessing


df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), 
                   columns=['a', 'b', 'c'])

def square(col):
    df[col] = df[col] ** 2

    return {'col':col, 'data':df[col]}


with multiprocessing.Pool(processes=16) as pool:
    data = pool.map(square, df.columns) 

for i in data:
    df[i['col']] = i['data']

print(df)

我尝试使用multiprocessing.Manageritertools,但是没有用,或者我使用不正确。

我该怎么做:

import pandas as pd
import numpy as np
import multiprocessing


df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]), 
                   columns=['a', 'b', 'c'])

def square(col):
    df[col] = df[col] ** 2
    # How to save changes here without returning data?


with multiprocessing.Pool(processes=16) as pool:
    data = pool.map(square, df.columns) 


print(df) 

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

您无能为力,结果必须从产生的过程返回到主过程。

您可能想签出ModinDask。另外,joblib loky 后端可能会有所帮助。您是否进行了性能分析以查看发生了什么?

答案 1 :(得分:1)

每个过程都需要对整个DataFrame进行酸洗和酸洗。这就是为什么它非常慢,并且每个进程还需要大量内存的原因。

您可以尝试将数据保存为HDF格式(df.to_hdf)并减少内存使用量,但实际上这样做太慢了。