2017-09-11 2 views
2

저는 현재 100 만 개가 넘는 항목 (트윗)의 증가하는 데이터베이스를 시각화하고 파이썬에서 병목 현상을 일으키는 프로젝트에 대해 잘 모르고 있습니다. 얼굴.Python의 대규모 MongoDB 컬렉션에 대한 빠른 쿼리

일부 세부 정보 :

  1. 데이터베이스는 시간, 텍스트 등 난에 질의하고 모든 필드에 색인이 생성됩니다.

  2. 컬렉션의 각 항목에는 거의 100 개의 중첩 된 필드가 포함 된 매우 크고 복잡한 구조가 포함되어 있습니다.

  3. 시각화는 저장된 데이터의 일부만 필요하기 때문에 적은 수의 열만 투영합니다.

  4. 쿼리 된 필드는 String, float32/64, date 및 id 유형입니다.

몽고 쉘 내에 소정 기간 동안 데이터를 질의, 처리 시간이 허용되는 이상, 그러나, 파이썬 이내에 모든 쿼리 지수 오래 걸릴. 내가 이런 일이 벌어지는 이유에 대해 제대로 이해하고 있다고 생각하지만 해결책을 찾기에 충분한 지식이 없습니다.

저는 PyMongo와 Monary를 모두 사용했습니다. 둘 다 실망스러운 결과를 보았습니다.

Mongo 쉘에서 파이썬 내에서 처리 시간을 가깝게하는 확실한 해결책이 있습니까? Idea는 Mongo가 Python으로 전송하기 전에 쿼리 결과를 별도의 컬렉션에 저장하고 Python/Pandas 대신 Javascript 기반 솔루션을 사용하는 방법을 고려했습니다.

Monary를 사용하는이 쿼리 (10 초 동안)는 2878 개의 행을 반환하고 76 초가 걸립니다.

start_time = datetime.datetime.strptime('2017-09-09 00:00:00', '%Y-%m-%d 
    %H:%M:%S').replace(
     tzinfo=timeZone).astimezone(tz.tzutc()) 
    end_time = datetime.datetime.strptime('2017-09-09 00:10:00', '%Y-%m-%d 
    %H:%M:%S').replace(tzinfo=timeZone).astimezone(
     tz.tzutc()) 

    columns = ['created_at'] 
    type = ['date'] 

    arrays = mon.query(
      'streamingTwitterDB', 
      'streamingTwitterDB', 
      {'created_at': {'$gt': start_time, '$lte': end_time}}, 
      columns, 
      type 
     ) 

    df = numpy.matrix(arrays).transpose() 
    df = pd.DataFrame(df, columns=columns) 

mongo에서 나는 거의 즉시 한 시간 동안 쿼리 할 수 ​​있습니다.

답변

1

프로토 타입 BSON-NumPy library을 사용해보세요. PyMongo (문서를 NumPy 배열의 행으로 변환하기 전에 dicts로 변환해야 함)와 Monary의 오버 헤드 (필드 이름과 일치하는 n- 제곱 알고리즘으로 인해 큰 문서에서 속도가 느려짐)를 피할 수 있습니다. NumPy 열). 문제가 있으면 the BSON-NumPy issue tracker으로 알려 주시기 바랍니다.

+1

이 모듈은 꽤 유망 해 보입니다! 타이밍 비교를 했습니까? – MaxU

+0

예, 빠릅니다. PyMongo (문서를 NumPy 배열의 행으로 변환하기 전에 dicts로 변환해야 함)와 Monary의 오버 헤드 (필드 이름과 일치하는 n- 제곱 알고리즘으로 인해 큰 문서에서 속도가 느려짐)를 피할 수 있습니다. NumPy 열). 시도해보고 어떻게 효과가 있는지 알려주세요! –

+0

이 라이브러리는 변환하기 전에 컬렉션 내의 필드를 쿼리 할 수 ​​있습니까? 데이터가 전체적으로 투영되거나 변환되는 예제 만 찾을 수 있습니다. –