2017-09-11 50 views
2

我目前正在開發一個項目,該項目涉及可視化超過100m條目(微博)的不斷增長的數據庫,並且遇到了Python中的一些瓶頸問題,我不知道如何面對。從Python快速查詢大型MongoDB集合

一些細節:

  1. 該數據庫索引的所有字段我查詢上,包括時間和文本。

  2. 集合中的每個條目都包含一個非常龐大而複雜的結構,有近100個嵌套字段。

  3. 我只投射少量列,因爲可視化只需要一小部分存儲的數據。

  4. 查詢的字段類型爲String,float32/64,date和id。

當查詢該數據爲蒙戈外殼內的給定時間範圍,處理時間比更可接受,但是,內的Python所做的任何查詢指數地需要更長的時間。雖然我認爲自己對這種情況發生的原因有了很好的理解,但我並沒有足夠的知識來尋找解決方案。

我已經使用PyMongo和Monary,都有令人失望的結果。

是否有任何明顯的解決方案可以讓Python內的處理時間更接近Mongo shell的時間?我想過的想法包括讓Mongo在轉移到Python之前將查詢結果保存到一個單獨的集合中,並嘗試使用基於Javascript的解決方案而不是Python/Pandas。

使用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) 

在蒙戈我幾乎可以瞬間查詢一個小時。

回答

1

試試我們的原型BSON-NumPy library。它避免了PyMongo的開銷(它必須在將文檔翻譯成NumPy數組中的行之前將文檔轉換爲字典),以及Monary的開銷(由於匹配字段名的n平方算法, NumPy列)。如果您有問題,請通過the BSON-NumPy issue tracker告訴我們。

+1

這個模塊看起來很有希望!你做過任何時間比較嗎? – MaxU

+0

是的,速度更快。它避免了PyMongo的開銷(它必須在將文檔翻譯成NumPy數組中的行之前將文檔轉換爲字典),以及Monary的開銷(由於匹配字段名的n平方算法, NumPy列)。請嘗試一下,讓我們知道它是如何爲你工作的! –

+0

此庫允許在轉換之前查詢集合中的字段嗎?我只能找到數據全部投射或轉換的例子。 –