我目前正在開發一個項目,該項目涉及可視化超過100m條目(微博)的不斷增長的數據庫,並且遇到了Python中的一些瓶頸問題,我不知道如何面對。從Python快速查詢大型MongoDB集合
一些細節:
該數據庫索引的所有字段我查詢上,包括時間和文本。
集合中的每個條目都包含一個非常龐大而複雜的結構,有近100個嵌套字段。
我只投射少量列,因爲可視化只需要一小部分存儲的數據。
查詢的字段類型爲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)
在蒙戈我幾乎可以瞬間查詢一個小時。
這個模塊看起來很有希望!你做過任何時間比較嗎? – MaxU
是的,速度更快。它避免了PyMongo的開銷(它必須在將文檔翻譯成NumPy數組中的行之前將文檔轉換爲字典),以及Monary的開銷(由於匹配字段名的n平方算法, NumPy列)。請嘗試一下,讓我們知道它是如何爲你工作的! –
此庫允許在轉換之前查詢集合中的字段嗎?我只能找到數據全部投射或轉換的例子。 –