29

Google App Engine gruplarında birçok kullanıcının (, Fig2, Fig3), fatura raporlarında yüksek miktarda Datastore okumasının nereden geldiğini bulamıyorum.
Bildiğiniz gibi, Datastore reads 50K işlem/güne sınırlıdır, bu bütçenin üzerinde ödemeniz gerekir.Her bir Getirme, Sayma ve Sorgulama işlemlerini kaç Datastore okuyor?

50K işlemleri çok fazla kaynak gibi görünüyor, ancak açıkçası, her işlemin (Sorgu, Varlık getirisi, Sayım ..) birçok Datastore okumasını gizlediği görülüyor.

API ya da başka bir yaklaşımla bilmek mümkün mü, ortak olan RPC.get, RPC.runquery çağrılarının arkasında kaç tane Datastore okuması var? Bu durumda, sadece RPC ayrıntılarını verdiği ve gizli okuma maliyetini vermediği için, yararsız görünmektedir. Basit böyle Modeli olması

: veri deposuna

class Example(db.Model): 
    foo = db.StringProperty()  
    bars= db.ListProperty(str) 

ve varlıkları, ben operasyonların bu tür maliyeti ilgileniyorum:

items_count = Example.all(keys_only = True).filter('bars=','spam').count() 

items_count = Example.all().count(10000) 

items = Example.all().fetch(10000) 

items = Example.all().filter('bars=','spam').filter('bars=','fu').fetch(10000) 

items = Example.all().fetch(10000, offset=500) 

items = Example.all().filter('foo>=', filtr).filter('foo<', filtr+ u'\ufffd') 
+0

Geri dönen her öğenin bir okuma olduğunu düşünüyorum, eğer bir ref sahne varsa, o zaman ilk kez eriştiğinizde okuma da olur. Getirmenin (X), sayım çok yüksek olduğunda X öğelerinin döndüğü anlamına gelmediğine dikkat edin, daha sonra yığınlarda çalışır ve her yığın, veri okundu olarak sayılır (toplu boyut). Sayımın (X) veri okumaları açısından nasıl çalıştığı hakkında hiçbir fikrim yok, tek bir okuma olarak sayılmalı, ama onun arzulu bir düşüncesi. –

cevap

10

http://code.google.com/appengine/docs/billing.html#Billable_Resource_Unit_Cost bakınız. Sorgulanan her varlık için 1 oku okuduğunuzda ve 1 okundu bilgisi. "İade", ofset veya sayım tarafından atlanan varlıkları içerir. Böylece 1001 bunların her biri için okur: Bunlar için

Example.all(keys_only = True).filter('bars=','spam').count() 
Example.all().count(1000) 
Example.all().fetch(1000) 
Example.all().fetch(1000, offset=500) 

, tahsil okur sayısı filtrelere uyan 1 artı birimi sayısını:

Example.all().filter('bars=','spam').filter('bars=','fu').fetch() 
Example.all().filter('foo>=', filtr).filter('foo<', filtr+ u'\ufffd').fetch() 

yerine sayımı size kullanmanın sayımı bir kereden fazla güncellemeniz gerekiyorsa, sayımın veri deposunda saklanmasını dikkate almalısınız. http://code.google.com/appengine/articles/sharding_counters.html

Mümkün olduğunda, bir ofset yerine imleçler kullanmalısınız.

+0

Gönderdiğiniz bağlantıda, döndürülen varlık başına 1 okundu bilgisi olduğuna dair bir başvuru göremiyorum, aslında veri deposu okumalarından hiç bahsetmiyorum. –

+0

Hata! Yanlış bağlantıyı yapıştırdım. Şimdi düzeltdim – ribrdb

3

Sadece emin olmak için:

Neredeyse eminim:

Example.all().count(10000) 

Bu küçük veri deposu işlemleri (varlıkları, yalnızca tuşları getirmesi gerekmez) kullanır, bu yüzden bu 1 olarak sayılır + 10.000 (azami) küçük işlemi oku.

+0

Haklısınız - "küçük işlemler" yukarıdaki ifadeden etkilenir, "okuma işlemleri" değil. Bunu bir GAE projesinde kontrol ettim. –