我有一个大型数据框,其中包含与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 ..'“)'