작성
·
6.3K
1
안녕하세요.
실습을 하던 중 아래코드에서 AttributeError가 발생해서 질문 올립니다.
코드 :
from multiprocessing import Pool
import numpy as np
def _apply_df(args):
df, func, kwargs = args
return df.apply(func, **kwargs)
def apply_by_multiprocessing(df, func, **kwargs):
# 키워드 항목 중 workers 파라메터를 꺼냄
workers = kwargs.pop('workers')
# 위에서 가져온 workers 수로 프로세스 풀을 정의
pool = Pool(processes=workers)
# 실행할 함수와 데이터프레임을 워커의 수 만큼 나눠 작업
result = pool.map(_apply_df, [(d, func, kwargs)
for d in np.array_split(df, workers)])
pool.close()
# 작업 결과를 합쳐서 반환
return pd.concat(list(result))
이구요.
에러:
AttributeError: Can't get attribute '_apply_df' on <module '__main__' (built-in)>
위와 같은 에러가 발생하는데 5달 전에 같은 문제를 겪으신 분이 계시더라구요. 해당 답변에 colab에서는 잘 실행이 되는데 제 PC에서는 에러가 생기는데 어떻게 해야 해결될까요?
답변 5
1
안녕하세요.
colab 에서 실행이 잘 되었는데 사용하고 계신 환경에서 실행이 안 된다면 아마도 환경문제 인거 같은데요.
해당 코드는 멀티프로세싱을 하도록 쓰레드를 여러 개 만드는데 환경에 따라 오류가 발생하는거 같아요.
찾아보니 아래와 같은 이슈가 ipython 에 있는데 주피터 노트북은 ipython을 사용하고 있어요.
[Can't use multiprocessing module in IPython · Issue #10894 · ipython/ipython](https://github.com/ipython/ipython/issues/10894)
위에 있는 방법으로 해결을 해보시거나 Colab으로 실습을 해보시는게 좋을거 같아요.
해당 기능은 전처리시 시간이 오래 걸리기 때문에 멀티프로세싱을 통해 전처리 시간을 줄이도록 한 코드인데요.
worker의 수를 4가 아닌 1로 변경해서 해보시고 같은 오류가 발생한다면 Colab을 사용하시는 방법과 github에 있는 이슈로 해결해 보시는 방법이 있을거 같아요.
1
14번 라인에 말씀하신<function __main__._apply_df(args)> 가 출력되는데요.
그 아래 코드를 돌렸을 때 아나콘다 프롬프트에서
에러가 발생합니다.
1
안녕하세요.
어떤 강의에서의 질문인지를 몰라서 제가 파일 임포트 부분의 오류라 생각했는데 part1에서의 질문이었네요.
해당 함수를 다른 파트에서는 별도의 파일로 분리를 해서 사용하거든요.
혹시 위에 코드의 오류가 아래 코드를 실행했을 때 나는 오류인가요?
%time clean_train_reviews = apply_by_multiprocessing(\
train['review'], review_to_words, workers=4)
만약 그렇다면 새로운 셀을 만들고 다음코드를 그냥 실행해 보세요.
_apply_df
바로 아래 다음과 같은 결과가 나오는지도 확인을 해주세요.
<function __main__._apply_df(args)>
오류 내용을 봤을 때 함수가 제대로 정의되지 않은것 같아요.
아래의 코드가 실행된 상태여야지 _apply_df 를 사용할 수 있습니다.
from multiprocessing import Pool import numpy as np def _apply_df(args): df, func, kwargs = args return df.apply(func, **kwargs) def apply_by_multiprocessing(df, func, **kwargs): # 키워드 항목 중 workers 파라메터를 꺼냄 workers = kwargs.pop('workers') # 위에서 가져온 workers 수로 프로세스 풀을 정의 pool = Pool(processes=workers) # 실행할 함수와 데이터프레임을 워커의 수 만큼 나눠 작업 result = pool.map(_apply_df, [(d, func, kwargs) for d in np.array_split(df, workers)]) pool.close() # 작업 결과를 합쳐서 반환 return pd.concat(list(result))
1
안녕하세요.
해당 함수가 있는 파일이 제대로 로드되지 않은거 같아요.
import 를 통해 KaggleWord2VecUtility.py 파일이 로드 되어야 해당 함수를 사용하실 수 있어요.
파일 경로와 import 하는 과정이 제대로 되었는지 확인해 보세요!
0
선생님 tutorial-part-1 에는 KaggleWord2VecUtility.py 파일 import 하는 코드가 없는데 어찌해야할까요?
위 함수 돌리고 %time clean_train_reviews = apply_by_multiprocessing(train['review'], review_to_words, workers=4)
에서 에러가 발생해요.