- dataframe에서
apply
의 수행시간이 매우 느리다면 여러개의 프로세스를 사용해 처리하는 방법을 고려해보는게 좋다.
multiprocessing.cpu_count()
을 통해 cpu 코어의 수를 가져올 수 있다.
- 코어수를 가져오고
udf
를 생성했다면 아래와 같이 구현하면 된다.
def text_preprocessing(df):
# df['pre_context'] = df.progress_apply(preprocessing_udf, axis=1) # 다음과같이 진행상황을 출력하고 싶었으나 화면에 이상하게 출력됨
df['p_context'] = df.apply(preprocessing_udf, axis=1)
return df
from multiprocessing import Pool
import multiprocessing
print ('cpu counts: %d' % multiprocessing.cpu_count())
def parallelize_dataframe(df, func, n_cores=8):
df_split = np.array_split(df, n_cores) # core의 개수로 df를 나눈다.
pool = Pool(n_cores) # pool을 cpu 코어 개수 만큼 생성하고
df = pd.concat(pool.map(func, df_split)) # 나눠진 df를 func으로 넘겨서 수행한다.
pool.close()
pool.join() # 모두가 완료될때까지 대기
return df
result_sample = parallelize_dataframe(result_df, text_preprocessing)
- 코어의 개수에따라 linear하게 성능이 증가하진 않지만 상당한 성능 향상에 기여할 수 있음
- 참고