2016-07-12 4 views
1

Ich habe den folgenden Code-Arrays zu sammeln (wie eingelegte Dokumente in einer Sammlung Mongo gespeichert sind) und in eine Matrix numpy 2D Stack:Abrufen von mehreren Dokumenten aus mongo cursor.next() für eine bessere Leistung

db = MongoClient()['db'] 
total = db.command('collStats', 'collection')['count'] 
collection = db['collection'] 

X, Y = np.array([]), np.array([]) 
pipe = [{'$sample': {'size': total}}] 
cursor = collection.aggregate(pipe, allowDiskUse=True) 

for i in range(1000): 
    try: 
     xy = pickle.loads(cursor.next()['array']) 
     if not np.size(X): 
      X, Y = xy[0:-1], xy[-1] 
     else: 
      X, Y = np.vstack((X, xy[0:-1])), np.vstack((Y, xy[-1])) 
    except StopIteration: 
     break 

Das ist extrem langsam. Wie kann ich das optimieren, zum Beispiel um mehrere Dokumente gleichzeitig von Mongo zu lesen? Alle anderen Optimierungstipps wären auch nützlich.

+0

Haben Sie Ihren Code profiliert, um zu sehen, wo er die meiste Zeit verbringt? Warum benutzt du hier 'range'? – styvane

+0

Warum müssen Sie den Befehl "collStats" ausführen? Außerdem gibt es ein Leistungsproblem mit '$ sample'. Was versuchst du zu machen? – styvane

+0

@SSDMS, verwende ich 'range', um die Zufallsstichprobe zu durchlaufen und 1000 Dokumente, die als Arrays zurückgegeben werden, in einer 2D-Matrix zu stapeln. Ich führe den Befehl 'collstats' aus, um die Gesamtzahl der Dokumente in der Sammlung zu ermitteln. Grundsätzlich möchte ich auf zufällige Dokumente in der Sammlung zugreifen können. Es dient letztlich dazu, Trainingsbeispiele in ein neuronales Netzwerk einzubringen. Was sind die Leistungsprobleme mit '$ sample' und wie kann ich sie umgehen, während ich immer noch mache was ich will? – cerremony

Antwort

0

Der beste Weg, fand ich die Leistung verbessern:

  1. Konvertieren jedes Element in einer Liste
  2. anhängen, dass die Liste in eine Liste von Listen
  3. Konvertieren in ein 2D-numpy Array

Also, für meinen Fall, wie folgt:

xy = pickle.loads(curosor.next()['array']).tolist() 
X, Y = [xy[0:-1]], [[xy[-1]]] 

for i in range(1000): 
    try: 
     xy = pickle.loads(cursor.next()['array']).tolist() 
    except StopIteration: 
     break 
    X.append(xy[0:-1]) 
    Y.append([xy[-1]]) 

X, Y = np.array(X), np.array(Y) 

Verbesserte meine Leistung um den Faktor 50.

-1

Es gibt eine cursor.toArray(), die alles auf einmal zurückgibt.

Verwandte Themen