2016-11-29 67 views
0

我有一個充滿tweet的mongodb實例,我使用PyMongo作爲驅動程序。每條推文都有一個指定其語言的字段。我有以下彙總查詢:PyMongo聚合腳本沒有反應

def get_top_k_hashtags(client, db_name, lang_list, k_filter): 
    k_filter_base = k_filter 
    k_filter = "$" + k_filter 
    dbo = client[db_name] 
    pipeline = [ 
     {"$match": {"lang": {"$in": lang_list}}}, 
     {"$project": {k_filter_base: 1, "_id": 0}}, 
     {"$unwind": k_filter}, 
     {"$group": {"_id": k_filter + ".text", "count": {"$sum": 1}}}, 
     {"$sort": SON([("count", -1), ("_id", -1)])} 
] 
return dbo.tweets.aggregate(pipeline, allowDiskUse=True) 

我與下面的測試函數調用

def test_get_top_k_hashtags(client, db_name, lang_list, k_filter): 
    frequency = [] 
    cursor = get_top_k_hashtags(
     client, db_name, lang_list, k_filter) 
    for document in cursor: 
     frequency.append({'hashtag': document['_id'], 
         'value': document['count']}) 
    pprint(frequency) 
    write_json_file('hashtag_distribution', DATA_PATH, frequency) 

test_get_top_k_hashtags(client, 'twitter', ['ru'], 'entities.hashtags') 

什麼我做的是得到一個總數量爲所有特定語言下的主題標籤,在這種情況下, 'RU'。我有大約17K條推文,匹配'ru'和1300萬條推文'en'。當我使用'ru'推文運行它時,聚合在mongo shell和我的腳本中都起作用,但是當我爲'en'推文嘗試時,腳本掛起並且從未完成。

在mongo shell中'en'的運行聚合成功完成。當我從腳本運行它時,我可以檢查mongo shell中的操作,看到它啓動並完成,但我從來沒有得到任何輸出。

問題是,在Python腳本的情況下,當我嘗試聚合集合的較大子集時,即使它在數據庫中成功處理,也不會返回結果。我嘗試從Pymongo捕獲例外無濟於事。我懷疑有些東西是超時的,但我無法弄清楚它是什麼或如何捕捉它。

回答

0

對於任何可能會出現的人來看這個,我決定通過mongoshell來運行我長時間運行的查詢。我通過mongoshell運行我的聚合,然後輸出到一個集合並從那裏開始。