Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 访问多处理映射中的共享数据帧_Python_Pandas_Multiprocessing_Dataframe - Fatal编程技术网

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

Python 访问多处理映射中的共享数据帧,python,pandas,multiprocessing,dataframe,Python,Pandas,Multiprocessing,Dataframe,我正在尝试加速Python3中的一些多处理代码。我有一个大的只读DataFrame,还有一个基于读取值进行计算的函数 我试图解决在同一个文件中编写函数的问题,并共享大的DataFrame,如您所见。这种方法不允许将进程函数移动到另一个文件/模块,访问函数范围之外的变量有点奇怪 import pandas as pd import multiprocessing def process(user): # Locate all the user sessions in the *glob

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

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

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)
我尝试过的事情:

  • 传递数据帧而不是整数ID参数,以避免出现
    sessions.loc…
    代码行。这种方法大大降低了脚本的速度

另外,我已经看过了,但没有找到更好的方法。

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

def process(sessions, user):
   ...
把它放在你喜欢的地方

然后,当调用
p.map
时,可以使用函数,该函数允许增量指定参数:

 from functools import partial
 ...

 p.map(partial(process, sessions), sessions_id)
这不应使处理速度过慢,并解决您的问题

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

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

它在不太减慢处理速度的情况下工作。像
func(big_df,id)
这样带有签名的函数很常见吗?我看不出有任何问题。如果你真的不喜欢它,你可以考虑在构造函数中使用一个对象来获取df,并使用一个只获取id的
过程
方法,然后在
p.map
中调用该方法。我会称之为工程,但如果你的实际情况更复杂,它可能是有意义的。(如果你认为答案值得,请接受)