Frage Wie kann ich diesen Google App Engine-Code optimieren?


Ich bin relativ neu in der Python-Welt, aber das scheint sehr geradlinig zu sein.

Google schreit mich an, dass dieser Code optimiert werden muss:

class AddLinks(webapp.RequestHandler):
     def post(self):
          # Hash the textarea input to generate pseudo-unique value
          hash = md5.new(self.request.get('links')).hexdigest()

          # Seperate the input by line
          allLinks = self.request.get('links').splitlines()

          # For each line in the input, add to the database
          for x in allLinks:
               newGroup = LinkGrouping()
               newGroup.reference = hash
               newGroup.link = x
               newGroup.put()

          # testing vs live
          #baseURL = 'http://localhost:8080'
          baseURL = 'http://linkabyss.appspot.com'

          # Build template parameters
          template_values = {
               'all_links': allLinks,
               'base_url': baseURL,
               'reference': hash,
          }

          # Output the template
          path = os.path.join(os.path.dirname(__file__), 'addLinks.html')
          self.response.out.write(template.render(path, template_values))   

Das Dashboard sagt mir, dass dies eine Menge CPU verbraucht.

Wo sollte ich nach Verbesserungen suchen?


5
2017-10-30 13:40


Ursprung


Antworten:


Der Haupt-Overhead ist hier die Anzahl der einzelnen Puts zum Datenspeicher. Wenn Sie können, speichern Sie die Links als eine Einheit, wie Andre vorschlägt. Sie können die Links immer in ein Array aufteilen und in einer ListProperty speichern.

Wenn Sie für jeden Link eine Entität benötigen, versuchen Sie Folgendes:

# For each line in the input, add to the database
groups = []
for x in allLinks:
     newGroup = LinkGrouping()
     newGroup.reference = hash
     newGroup.link = x
     groups.append(newGroup)
db.put(groups)

Es wird die Datenspeicher-Roundtrips auf eins reduzieren, und es sind die Roundtrips, die wirklich Ihre hohe CPU-Begrenzung töten.


7



Sieht ziemlich eng zu mir aus.

Ich sehe eine Sache, die eine kleine Verbesserung machen kann. Ihr Aufruf "self.request.get ('links')" zweimal.

Also:

unsplitlinks = self.request.get('links')

Und Referenzierung, "unsplitlinks" könnte helfen.

Abgesehen davon ist die Schleife der einzige Bereich, den ich sehe, der ein Ziel für die Optimierung wäre. Ist es möglich, die Daten vorzubereiten und sie dann der Datenbank gleichzeitig hinzuzufügen, anstatt eine db-add pro-Verknüpfung auszuführen? (Ich nehme an, der Befehl .put () fügt den Link zur Datenbank hinzu)


3



Sie können die Interaktion zwischen Ihrer App und der Datenbank drastisch reduzieren, indem Sie nur die vollständige Datenbank speichern self.request.get('links') in einem Textfeld in der Datenbank.

  • einziger put() pro post(self)
  • der Hash wird nicht n-mal gespeichert (für jeden Link, der keinen Sinn macht und wirklich Platzverschwendung ist)

Und Sie sparen sich das Parsen des Textfeldes, wenn jemand die Seite aufruft ....


2



Wie oft wird das genannt? Das sieht nicht besonders schlecht aus ... besonders nach dem Entfernen der doppelten Anfrage.


0



Kann ich die ListProperty abfragen?

Etwas wie

SELECT * FROM LinkGrouping WHERE links.contains('http://www.google.com')

Ich habe Zukunftspläne, wo ich diese Funktionalität brauchen würde.

Ich werde definitiv die einzelne db.put () implementieren, um die Nutzung zu reduzieren.


0



Nein / Sie können etwas wie "links.contains ('http://www.google.de")" GQL unterstützt dies nicht


0