在python中对大型Dataframe实施多处理的最佳方法

时间:2019-07-01 22:30:32

标签: pandas multiprocessing ldap3

我有一个大型数据框,其中包含与Active Directory相关的数据,我必须在列上应用函数并将输出存储到列表中。

我发现的局限性之一是ldap3中的函数不能直接用于oder中的向量化输入,以绕过我的方法是将数据帧分为多个块并将其应用于该函数。 该功能可同时应用于多个卡盘(单个卡盘按顺序处理)

我有以下代码-

def searching_empid(user):
c = initiate_connection()
c.search(search_base='DC=xyz,DC=abc,DC=com',
         search_filter=f'(distinguishedName={ldap3.utils.conv.escape_filter_chars(user)})',
         search_scope=SUBTREE,
         attributes=['employeeID']
         )
id = c.entries[0].employeeID
return id

def vectorize_implementation(df):
    user_identifiers = df['Id'].values.astype(str)
    id_finder = lambda each_id : searching_empid(each_id)
    out=np.vectorize(id_finder, otypes=[list])
    try:
        out(user_identifiers)
    except ValueError:
        pass
    return out

if __name__ == '__main__':
    df = pd.read_pickle('Large_ADObject.pkl')
    n_proc = mp.cpu_count()
    chunksize = 30
    proc_chunks = []
    for i_proc in range(n_proc):
        chunkstart = i_proc * chunksize
        chunkend = (i_proc + 1) * chunksize if i_proc < n_proc - 1 else None
        proc_chunks.append(df.iloc[slice(chunkstart, chunkend)])
        assert sum(map(len, proc_chunks)) == len(df)

        with mp.Pool(processes=n_proc) as pool:
            proc_results = [pool.apply_async(vectorize_implementation,
                                             args=(chunk,))
                            for chunk in proc_chunks]
        #
        #     # blocks until all results are fetched
            result_chunks = [r.get() for r in proc_results]
            pool.close()
            pool.join()
            results = pd.concat(result_chunks)

        print(results)

我的目标是将所有结果放在一个对象中,以便可以将其用于进一步处理。

执行此操作时,我现在遇到以下错误。你们能帮我解决错误吗?

  

multiprocessing.pool.MaybeEncodingError:发送结果错误:   ”。原因:   'AttributeError(“无法腌制本地对象   'vectorize_implementation ..'“)'

0 个答案:

没有答案