Ich benutze die Riot API für League of Legends, um in Python zieht. Ich habe eine Sammlung, die nur IDs für Matchmade-Spiele ist, die ich nicht aus der API gezogen habe und eine andere, die gezogene Matchmade-Spiele ist. Insgesamt habe ich derzeit 94.040 gezogene Matches und 224.346 Match-IDs, die ich noch nicht gezogen habe.Wie beschleunigt man diese PyMongo Abfrage/Schleife
In meinem Code überprüfe ich Profile von Personen nach neuen Übereinstimmungs-IDs, um sie gegen die Übereinstimmungen hinzuzufügen, die ich bereits habe, bevor ich sie zu der Sammlung von IDs hinzufüge, die ich noch nicht gezogen habe. Es dauert etwa 7 Sekunden für jede Iteration durch die zweite Sammlung.find, und ich bin mir nicht sicher warum. Ich habe beide Sammlungen indiziert, und wenn ich collection.find ({}) .sort ({}) benutzte, dauerte es aus irgendeinem Grund länger.
Hier ist mein Code:
if matches.find('game_id': 'match_id').count() == 0 //Match does not exist in the database.
So wurden Sie die Datenbank jeder zurückkehren zu müssen:
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()
Ich möchte nur sicherstellen, dass ich Ihre innere Schleife richtig verstehe. Ziehen Sie jeden Eintrag in der Übereinstimmungssammlung aus und vergleichen Sie ihn mit der aktuellen Übereinstimmungs-ID, um festzustellen, ob er bereits in der Datenbank vorhanden ist? –
Ja. Ich kann ein Beispiel dafür geben, wie der JSON aussieht, wenn das helfen würde, aber ich überprüfe jede Übereinstimmungs-ID nach allen Übereinstimmungs-IDs, die ich bereits in der Datenbank habe, bevor ich sie der Sammlung von Übereinstimmungen hinzufüge, die sein müssen gezogen. – malsatori
Anstatt durch alle zu iterieren, könnten Sie eine Abfrage wie 'if matchs.find ('game_id': 'match_id') machen. Count() == 0' _ // Das Match existiert nicht in der Datenbank_. Außerdem entschuldige ich mich im Voraus, wenn die .count() für Pymongo nicht so funktioniert. Ich habe es mit Mongo in anderen Sprachen benutzt, aber das nicht. Ich werde nachsehen und zum Bearbeiten zurückkehren. –