5

私はPythonの世界には比較的慣れていませんが、これは非常に簡単に思えます。

Google は、このコードを最適化する必要があると私に怒鳴っています。

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))   

ダッシュボードは、これが大量の CPU を使用していることを示しています。

どこで改善を探すべきですか?

4

6 に答える 6

7

ここでの主なオーバーヘッドは、データストアへの複数の個別の書き込みです。可能であれば、Andreが提案するように、リンクを単一のエンティティとして保存します。リンクはいつでも配列に分割して、ListPropertyに格納できます。

リンクごとにエンティティが必要な場合は、次のことを試してください。

# 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)

データストアのラウンドトリップが1つに減り、CPUの高い上限を実際に殺しているのはラウンドトリップです。

于 2008-10-30T14:41:19.420 に答える
3

私にはかなりタイトに見えます。

小さな改善をもたらす可能性のあることが1つあります。あなたの呼び出し、「self.request.get('links')」を 2 回。

したがって、次を追加します。

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

参照すると、「unsplitlinks」が役立ちます。

それ以外では、ループが最適化の対象となる唯一の領域です。リンクごとにデータベースを追加する代わりに、データを準備してから一度にデータベースに追加することは可能ですか? (私は .put() コマンドがデータベースへのリンクを追加すると仮定します)

于 2008-10-30T14:13:15.717 に答える
2

self.request.get('links')完全なテキスト フィールドをデータベースに格納するだけで、アプリとデータベース間のやり取りを大幅に減らすことができます。

  • put()1つだけpost(self)
  • ハッシュはn回保存されません(すべてのリンクに対して、これは意味がなく、実際にはスペースの無駄です)

そして、誰かが実際にページを呼び出したときに、テキストフィールドの解析を節約できます....

于 2008-10-30T14:22:26.557 に答える
0

ListProperty に対してクエリを実行できますか?

何かのようなもの

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

その機能が必要になる将来の計画があります。

使用量を減らすために、単一の db.put() を確実に実装します。

于 2008-10-30T14:58:50.977 に答える
0

いいえ/「links.contains(' http://www.google.com ')」のようなものは使用できませんGQL はこれをサポートしていません

于 2008-11-05T10:25:38.040 に答える
0

これはどのくらいの頻度で呼び出されますか? これはそれほど悪くはありません...特に重複したリクエストを削除した後。

于 2008-10-30T14:21:41.130 に答える