2017-01-31 1 views
4

셀러리 작업자를 사용하여 컴퓨터 학습 모델의 결과를 얻고 있습니다. 큰 덩어리의 데이터를 셀러리에 전달하는 방법

내가하고있는 일은 클라이언트에서 셀러 리 작업으로 큰 numpy 배열 (몇 메가 바이트)을 보내는 것입니다.

현재 클라이언트 numpy 배열을 base64로 직렬화하고 있습니다. 내가 저장/클라이언트 또는 셀러리 작업자의 Redis에서 직접 데이터를 가져올 때 시스템의 성능은/셀러리가 모든 인수 (numpy의 base64)를 넘길 때보 다 훨씬 빠릅니다.

args/numpy 배열을 전달하고 클라이언트에서 직접 redis가 아닌 셀러리 ('redis'브로커와 함께)를 사용하고 싶습니다. 문제가 될 수있는 곳을 알고 있습니까? 이 작업을보다 효과적으로 수행하기 위해 셀러리 구성을 어떻게 설정할 수 있습니까? (클라이언트 -> 브로커 -> 작업자와 클라이언트간에 데이터 전달) 대

 serialized = np.asarray(images).reshape((number_of_records, size)).ravel().tostring() 
     serialized = base64.b64encode(serialized) 
     #self.redis.set(key, serialized) 

     print('calling celery processor') 
     result = self.celery.send_task('process', args=[number_of_records, serialized], kwargs={}) 
     returncode, result = result.get(timeout=1000, interval=0.1) 

(이 직접, 빠르게 레디 스 스토리지의 사용입니다) : 직렬화, 구성 설정에 대한 셀러리의 성능을

 serialized = np.asarray(images).reshape((number_of_records, size)).ravel().tostring() 
     serialized = base64.b64encode(serialized) 
     self.redis.set(key, serialized) 

     print('calling celery processor') 
     result = self.celery.send_task('process', args=[number_of_records, key], kwargs={}) 
     returncode, result = result.get(timeout=1000, interval=0.1) 

     resultc= self.redis.get(key) 

모든 팁, ...? 나는이 시스템을 빠르고 간단하게 만들고 싶다. 두 번째 예제에서와 같이 실제로 redis를 직접 사용해야합니까?

+0

는이 문제를 해결 했습니까? – luanbuingoc

답변

0

셀러리는 JSON 또는 cPickle을 사용하여 메시지를 직렬화합니다. 따라서 두 가지 일이 일어날 수 있습니다. 먼저 base64 (비효율적)에서 JSON 또는 cPickle로 두 번 직렬화하는 것입니다.

base64 인코딩을 완전히 건너 뛰고 셀러리가 처리하도록 시도 했습니까?

이 코드 (더 효율적으로)의 cPickle 대신 JSON (기본값)를 사용하도록 셀러리를 알 수 있습니다 :

app.conf.task_serializer = 'pickle' 
app.conf.result_serializer = 'pickle' 
관련 문제