私はPythonでプルを作るために、League of LegendsのRiot APIを使用しています。私はAPIから引っ張っていないマッチメイドゲームのIDと引っ張ったマッチメイドゲームのIDだけのコレクションを持っています。私は現在、94,040の試合と224,346試合のIDを持っています。このPyMongoクエリ/ループをスピードアップするには
私のコードでは、私がまだ引っ張っていないIDのコレクションに追加する前に、私がすでに持っているマッチに対して追加する新しいマッチIDのプロフィールをチェックしています。それは2回目のcollection.findを通してそれぞれの反復のために約7秒を要しています、そして、なぜ私は確信していません。私はコレクションのインデックスを両方とも持っていて、collection.find({})sort({})を使用していたときに何らかの理由で実際に時間がかかりました。ここで
は私のコードです:
import pymongo
import time
client = pymongo.MongoClient('mongodb://localhost')
match_db = client.matched_games
summoner_db = client.summoner_match_history
match_id_db = client.match_id
matches = match_db.matches
summoners = summoner_db.summoners
match_id = match_id_db.match
def main():
for matchid in summoners.find({}, {'matches.gameId': 1, '_id': 0}, no_cursor_timeout=True):
timer = time.time()
try:
for match in matchid['matches']:
print(match)
match = match['gameId']
for k in matches.find({}):
k = k['gameId']
if k == match:
print(time.time() - timer)
timer = time.time()
print('Already have match #' + str(k))
break
else:
print(time.time() - timer)
timer = time.time()
print('Inserting match #' + str(match) + '.')
match_id.insert({'match_id': match})
except KeyError as e:
print(e)
pass
except pymongo.errors.DuplicateKeyError as e:
# print(e)
pass
if __name__ == '__main__':
main()
私はちょうどあなたの内部ループを正しく理解していることを確認したいです。一致コレクションのすべてのエントリを取り出し、それが現在の一致IDと比較して、データベースに既に存在するかどうかを確認していますか? –
はい。 JSONがどのように見えるかの例を投稿できますが、必要な一致のコレクションに追加する前に、データベース内にあるすべての一致IDで各一致IDを確認しています引っ張られた。 – malsatori
これらのすべてを反復するのではなく、 'matches_find( 'game_id': 'match_id')のようなクエリを実行できますか?count()== 0' _ // match_はデータベースに存在しません。また、pymongoの.count()がこのように動作しない場合は、事前に謝罪します。私は他の言語でMongoと一緒に使用しましたが、これは使用しませんでした。私はそれを見て編集に戻る。 –