29

Tôi đang đọc trên các nhóm Máy ứng dụng của Google nhiều người dùng (Fig1, Fig2, Fig3) không thể tìm ra nơi số lượng lớn dữ liệu được đọc trong báo cáo thanh toán của họ đến từ đâu.
Như bạn có thể biết, Datastore reads bị giới hạn ở mức 50K hoạt động/ngày, cao hơn ngân sách này bạn phải trả.Có bao nhiêu lần đọc Datastore tiêu thụ từng hoạt động Tìm nạp, Đếm và Truy vấn?

Hoạt động 50K nghe có vẻ như rất nhiều tài nguyên, nhưng thật không may, có vẻ như mỗi thao tác (Truy vấn, Tìm nạp thực thể, Đếm ..), ẩn một số lần đọc Datastore.

Có thể biết thông qua API hoặc một số phương pháp tiếp cận khác, số lượng lần đọc Datastore bị ẩn sau các cuộc gọi RPC.get, RPC.runquery phổ biến?

Appstats dường như vô dụng trong trường hợp này vì nó chỉ cung cấp chi tiết RPC chứ không phải chi phí đọc ẩn.

Có một mô hình đơn giản như thế này:

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

và đối tượng trong kho dữ liệu, Tôi quan tâm đến chi phí của các loại hoạt động:

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

Tôi nghĩ rằng mỗi thực thể trả lại là một lần đọc, nếu bạn có một đạo cụ chỉnh sửa thì lần đầu tiên bạn truy cập nó cũng là một đọc. Lưu ý rằng fetch (X) không có nghĩa là các thực thể X được trả về nếu số đếm quá cao sau đó nó sẽ làm việc trong các bulks và mỗi số lượng lớn sẽ được tính là dữ liệu đọc (kích thước hàng loạt). Tôi không biết số đếm (X) hoạt động như thế nào đối với việc đọc dữ liệu, nó sẽ được tính là một lần đọc duy nhất nhưng đó là một suy nghĩ mơ hồ. –

Trả lời

10

Xem http://code.google.com/appengine/docs/billing.html#Billable_Resource_Unit_Cost. Truy vấn tính phí cho bạn 1 lần đọc và 1 lần đọc cho mỗi thực thể được trả về. "Đã trả lại" bao gồm các thực thể bị bỏ qua bằng cách bù đắp hoặc đếm. Vì vậy, đó là 1001 lần đọc cho mỗi người trong số này:

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

Đối với những, số lượng các nội dung đã tính phí là 1 cộng với số lượng các đơn vị phù hợp với các bộ lọc:

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

Thay vì sử dụng count bạn nên xem xét việc lưu trữ số đếm trong kho dữ liệu, được phân loại nếu bạn cần cập nhật số đếm nhiều hơn một lần trong một giây. http://code.google.com/appengine/articles/sharding_counters.html

Bất cứ khi nào có thể, bạn nên sử dụng con trỏ thay vì bù trừ.

+0

Tôi không thể thấy bất kỳ tham chiếu nào trong liên kết mà bạn đăng tải rằng chi phí 1 lần đọc cho mỗi thực thể được trả lại, trên thực tế tôi không thấy bất kỳ đề cập nào về lần đọc dữ liệu. –

+0

Rất tiếc, tôi đã dán liên kết sai. Tôi đã sửa nó ngay bây giờ – ribrdb

3

Chỉ cần chắc chắn rằng:

Tôi gần như chắc chắn:

Example.all().count(10000) 

một này sử dụng các hoạt động kho dữ liệu nhỏ (không cần phải lấy các thực thể, chỉ có phím), vì vậy đây sẽ được tính là 1 đọc + 10.000 (tối đa) hoạt động nhỏ.

+0

Bạn nói đúng - "hoạt động nhỏ" bị ảnh hưởng với biểu thức ở trên, không phải "hoạt động đọc". Chỉ cần kiểm tra điều đó trên một dự án GAE. –