2016-11-29 13 views
0

私は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'。私は 'ru'に合った約17Kのつぶやきと 'en'のための13万のつぶやきを持っています。集計はmongo shellと私のスクリプトの両方で 'ru'つぶやきで実行しますが、 'en'つぶやきにしようとするとスクリプトがハングアップして完了しません。

mongoシェルで 'en'の集計が正常に完了しました。スクリプトから実行すると、mongoシェルの操作を確認して起動と完了を確認できますが、決して出力はありません。

問題は、Pythonスクリプトの場合、コレクションがデータベース内で正常に処理されても、コレクションのより大きなサブセットを集計しようとすると結果が返されないということです。私はPymongoからの例外をキャッチして無駄にしようとしました。私は何かがタイムアウトしていると思うが、それが何であるか、それを捕まえる方法を理解できない。

答えて

0

これを見て、これを見ている他の人にとって、私はmongoshellで長時間実行しているクエリを実行することにしました。集計をmongoshellで実行し、コレクションに出力してそこから移動します。

関連する問題