2016-12-15 3 views
0
earnings = self.collection.find({}) #return 60k documents 
---- 
data_dic = {'score': [], "reading_time": [] } 
for earning in earnings: 
    data_dic['reading_time'].append(earning["reading_time"]) 
    data_dic['score'].append(earning["score"]) 
---- 
df = pd.DataFrame() 
df['reading_time'] = data_dic["reading_time"] 
df['score'] = data_dic["score"] 

코드 사이에 --- 완료하는 데 4 초가 걸립니다. 이 기능을 어떻게 향상시킬 수 있습니까?mongodb에서 데이터를 가져 오는 성능을 향상 시키십시오.

+0

각 목록을 data_dic에 사전 할당하고 목록에 지속적으로 추가하는 대신 특정 색인에서 요소를 변경하는 것이 하나의 가능성입니다. 또한 여러 코어를 사용할 경우 멀티 스레딩을 도입 할 수 있습니다. –

+0

try [MongoDB aggregation] (https://docs.mongodb.com/manual/aggregation/) – Valijon

답변

4

시간은 Mongodb 쿼리 시간, 데이터 전송에 사용 된 시간, 네트워크 왕복, 파이썬 목록 작업으로 구성됩니다. 각각을 최적화 할 수 있습니다.

하나는 전송할 데이터 양을 줄이는 것입니다. reading_timescore 만 필요하므로 가져올 수 있습니다. 평균 문서 크기가 클 경우이 방법이 매우 효과적입니다.

earnings = self.collection.find({}, {'reading_time': True, 'score': True}) 

초. Mongo는 제한된 양의 데이터를 배치로 전송합니다. 데이터에는 최대 60,000 개의 행이 포함되며 데이터를 전송하는 데 여러 번 걸립니다. 왕복 횟수를 줄이기 위해 cursor.batchSize을 조정할 수 있습니다.

셋째, 가능한 경우 네트워크 대역폭을 늘리십시오.

넷째. numpy array을 활용하여 가속화 할 수 있습니다. 그것은 파이썬리스트보다 더 빠른 C와 같은 배열 데이터 구조입니다. 고정 길이 배열을 미리 할당하고 인덱스로 값을 할당하십시오. 이렇게하면 list.append으로 전화 할 때 내부 조정을 피할 수 있습니다.