在多处理映射中访问共享数据帧

2024-05-08 00:58:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试加速Python3中的一些多处理代码。我有一个大的只读DataFrame和一个基于读取值进行一些计算的函数。在

我试图解决在同一个文件中编写一个函数的问题,并共享大的DataFrame,如您在这里所见。这种方法不允许将process函数移动到另一个文件/模块中,访问函数范围之外的变量有点奇怪。在

import pandas as pd
import multiprocessing


def process(user):
    # Locate all the user sessions in the *global* sessions dataframe
    user_session = sessions.loc[sessions['user_id'] == user]
    user_session_data = pd.Series()

    # Make calculations and append to user_session_data

    return user_session_data


# The DataFrame users contains ID, and other info for each user
users = pd.read_csv('users.csv')

# Each row is the details of one user action. 
# There is several rows with the same user ID
sessions = pd.read_csv('sessions.csv')

p = multiprocessing.Pool(4)
sessions_id = sessions['user_id'].unique()

# I'm passing an integer ID argument to process() function so 
# there is no copy of the big sessions DataFrame
result = p.map(process, sessions_id)

我尝试过的事情:

  • 传递一个DataFrame而不是integers ID参数以避免sessions.loc...行代码。这种方法大大降低了脚本的速度。在

另外,我也看过How to share pandas DataFrame object between processes?,但没有找到更好的方法。在


Tags: csvtheto方法函数iddataframedata
1条回答
网友
1楼 · 发布于 2024-05-08 00:58:28

您可以尝试将流程定义为:

def process(sessions, user):
   ...

把它放在你喜欢的地方。在

然后,当您调用p.map时,您可以使用^{}函数,该函数允许递增地指定参数:

^{pr2}$

这不应该太慢的处理和回答您的问题。在

请注意,您也可以在不使用partial的情况下执行相同的操作,使用:

 p.map(lambda id: process(sessions,id)), sessions_id)

相关问题 更多 >