【问题标题】:What is the simplest method to iterate over 20,000 entities in Google App Engine and export to a text file?在 Google App Engine 中迭代 20,000 多个实体并导出到文本文件的最简单方法是什么?
【发布时间】:2026-01-18 08:30:01
【问题描述】:

我在 Google App Engine 中有一个模型,它有 50,000 多个实体。我想创建一个 mapreduce 或其他操作来迭代所有 50,000 多个实体并将模型上的方法的结果导出到文本文件。完成后,我想下载文本文件。

在 Google App Engine 中执行此操作的最简单方法是什么?我只需要遍历所有实体并将expert_data() 的结果写到一个公共文件中。

#Example model
class Car(db.Model):
    color = db.StringProperty()

    def export_data(self):
        return self.color

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    使用 mapreduce API:https://developers.google.com/appengine/docs/python/dataprocessing/。它还有一个 BlobstoreOutputWriter,您可以使用它来创建一个 blob,然后下载该 blob。

    根据 Dave 的建议,这里是一个示例:http://code.google.com/p/appengine-mapreduce/source/browse/trunk/python/demo/main.py#264

    【讨论】:

    【解决方案2】:

    我发现使用远程处理 api 做这种事情是最简单的,否则您将不得不将数据存储在 blobstore 中,然后在完成后将其导出。

    远程处理 api 不如在 appengine 本身上运行它快,但肯定要容易得多。

    【讨论】:

    • 它叫做remote_api,而不是远程API。
    • 好的。感谢您的澄清。
    【解决方案3】:

    我会以不同的方式做到这一点 - 如果这里有弱点,请有人告诉我。

    我会使用一个任务队列和一个游标。查询前 1000 个左右的结果,使用实验性 blobstore 编程写入 API 将数据输出到 blobstore 文件。然后,用光标重新安排 self ,并在每次后续迭代中继续追加到文件中,并在光标处提取查询,直到完成。

    这可能会很慢 - 但它不会显着影响正在运行的应用程序,并且与 mapreduce 不同,它不会产生大量实例并且可能会花费您实际的金钱。它甚至可能不会产生一个额外的实例。

    【讨论】:

      【解决方案4】:

      如果您只需要导出到文件并且想要所有实体,则可以使用 appengine 批量加载器

      查看 appcfg.py 下载数据

      还有 https://developers.google.com/appengine/docs/python/tools/uploadingdata

      它处理重试限制线程等

      【讨论】:

        【解决方案5】:

        通过 Datastore 备份导出到 Google Cloud Storage,然后下载:

        http://gbayer.com/big-data/app-engine-datastore-how-to-efficiently-export-your-data/

        这看起来比其他方法快得多。我自己没试过。

        【讨论】:

          最近更新 更多