【问题标题】:Same DataFrame to be used by more functions in parallel/multiprocessing更多功能在并行/多处理中使用相同的 DataFrame
【发布时间】:2022-01-01 18:37:03
【问题描述】:

我正在使用 pd.read_csv 打开一个 .csv 并将其转换为 DataFrame。 DataFrame 需要进行一些更改以进行相应的缩放。缩放需要几分钟,所以应该只缩放一次。

data = pd.DataFrame(pd.read_csv(...))
for index, row in data.iterrow():
    data['specific_column'][index] = data['specific_column'][index] * (different scaling factors)
    etc.

然后有几个函数可以用这个缩放的 df 做不同的事情,我希望这些函数同时运行以节省一些时间。

def function1(input_data, arg1 ....)
    do something

def function2(input_data, arg1 ....)
    do something
    etc.

if __main__=='__name__':
    process1 = multiprocessing.Process(target=function1, args=(data, arg1, ....)
    process2 = multiprocessing.Process(target=function1, args=(data, arg1, ....)
    etc.

    processes = [process1, process2, ....]
    process1.start()
    process2.start()
    .....

    for process in processes:
        process.join()

我注意到这些进程正在一个接一个地运行(不是并行运行),并且 .csv 在每个进程之后一次又一次地重新打开和缩放,我知道每个进程都是从顶部一直重复代码开始的,但重新调整 DataFrame 需要花费太多时间。我猜唯一的问题是缩放后的 DataFrame 需要在内存中相乘(类似于我猜的产量),并且每个副本都由函数单独使用。 (每个函数都有一个副本)

我相信这应该是一个简单的解决方案,但在多处理领域相对较新,我自己无法找到该解决方案。请帮忙...

【问题讨论】:

  • stackoverflow.com/questions/70052925/… 有类似的讨论,建议的解决方案是使用 split -lcommand 拆分数据文件
  • 拆分数据是针对不同问题的解决方案。我的问题是如何将 DataFrame(有时可以小至 1MB)相乘,以便每个函数都复制一份。
  • 我不是 100% 确定我已经听懂了你的问题。但是为什么不将data 变量的创建移到if __main__=='__name__': 块内,应该是if __name__ == '__main__':

标签: python pandas dataframe multiprocessing


【解决方案1】:

每当调用原始 DataFrame 并在 if__main__='name'' 中创建数据变量时,它通过使用 .copy() 函数来解决

def function1(input_data, arg1 ....)
    do something

def function2(input_data, arg1 ....)
    do something
    etc.

if __main__=='__name__':
    data = pd.DataFrame('data.csv')
    process1 = multiprocessing.Process(target=function1, args=(data.copy(), arg1, ....)
    process2 = multiprocessing.Process(target=function1, args=(data.copy(), arg1, ....)
     etc.

     processes = [process1, process2, ....]
     process1.start()
     process2.start()
     .....

     for process in processes:
        process.join()

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2020-09-10
    • 1970-01-01
    • 2023-03-18
    • 2015-10-28
    相关资源
    最近更新 更多