2012-06-26 19 views

Trả lời

4

Sử dụng mapper - đây là một phần của khung công tác MapReduce, nhưng bạn chỉ muốn thành phần đầu tiên, bản đồ, vì bạn không cần bước trộn/giảm nếu bạn chỉ đơn giản là tắt các thực thể kho dữ liệu.

+0

Tôi thực sự đã sử dụng khung MapReduce để pipelining các hoạt động này có vẻ là một ý tưởng hay. Mối quan tâm của tôi là có nhiều thao tác đơn lẻ() hoạt động song song. ngoài vấn đề hiệu năng, tôi lo lắng về thời gian chờ của kho dữ liệu vì nhiều thực thể chia sẻ các nhóm thực thể. Có anyway để đường ống và vẫn tổng hợp put() s? –

+0

api map-reduce cho phép các hoạt động kho dữ liệu hàng loạt thông qua một nhóm đột biến. http://code.google.com/p/appengine-mapreduce/wiki/GettingStartedInPython –

3

Daniel đúng, nhưng nếu bạn không muốn làm hỏng người lập bản đồ, yêu cầu bạn thêm một thư viện khác vào ứng dụng của mình, bạn có thể sử dụng Task Queues hoặc thậm chí đơn giản hơn bằng cách sử dụng deferred library được bao gồm trong SDK 1.2 .3.

20.000 thực thể không phải là ấn tượng và tôi cho rằng nhiệm vụ này sẽ không được thực hiện thường xuyên (nhưng ngay cả khi có, nó là khả thi).

Dưới đây là ví dụ sử dụng NDB và thư viện hoãn lại (bạn có thể dễ dàng thực hiện việc đó bằng DB, nhưng hãy cân nhắc chuyển sang NDB nếu bạn chưa sử dụng nó). Đó là một cách khá thẳng về phía trước, nhưng không quan tâm nhiều đến thời gian chờ:

def update_model(limit=1000): 
    more_cursor = None 
    more = True 
    while more: 
    model_dbs, more_cursor, more = Model.query().fetch_page(limit, start_cursor=more_cursor) 
    for model_db in model_dbs: 
     model_db.updated = True 
    ndb.put_multi(model_dbs) 
    logging.info('### %d entities were updated' % len(model_dbs)) 

class UpdateModelHandler(webapp2.RequestHandler): 
    def get(self): 
    deferred.defer(update_model, _queue='queue') 
    self.response.headers['Content-Type'] = 'text/html' 
    self.response.out.write('The task has been started!') 
+1

Mối quan tâm chính của tôi liên quan đến phương pháp này là đạt đến giới hạn bộ nhớ mẫu vì tất cả các mô hình được lưu trữ trong bộ nhớ trước khi viết (tôi đã có trước đây) . Có thể có nhiệm vụ update_model sinh ra một nhiệm vụ update_model khác sau một số mẫu nhất định bằng cách truyền con trỏ và cứ thế. –

+0

@TomerWeller Tôi không nghĩ rằng đó là cần thiết, đây không phải là một thử nghiệm xâm nhập và nó rất dễ dàng để áp dụng nó vào ứng dụng của riêng bạn .. vì vậy hãy cho nó một shot và cho chúng tôi biết – Lipis

+1

"Vượt quá giới hạn bộ nhớ riêng tư với 155,32 MB sau khi phục vụ 1 yêu cầu tổng số ". Tôi có 18.000 thực thể trung bình ở mức 10KB cho mỗi thực thể. Đây là một thất bại dự kiến ​​kể từ khi trường hợp frontend cơ bản có 128MB bộ nhớ và tôi đang cố gắng tải 180MB giá trị của dữ liệu. Thật tuyệt khi appengine cho phép tôi nhận được 155 :) –

Các vấn đề liên quan