从一种模式迁移到另一种模式的最有效方法?

时间:2013-08-27 04:17:22

标签: python google-app-engine app-engine-ndb

我想将我的日志记录数据合并到一个StatisticStore模型中。现在,我的测井数据散布在3个模型周围,这是一团糟。

迭代所有3个模型的所有记录的最佳方法是什么,并在新的StatisticStore模型中创建每个模型的副本?

2 个答案:

答案 0 :(得分:1)

如果每个模型只有几千个实体,我只需使用数据存储fetch迭代这三个模型中的每一个,并将它们存储在新的StatisticStore实体中。您甚至可以使用remote api

执行此操作

如果每个型号有数千个实体,请查看MapReduce framework。使用MapReduce框架,您需要为三个模型和三个映射函数编写管道定义,这些函数将实体存储在StatisticStore中。在您的情况下,“减少”部分应该是不必要的。

this SO question的答案也可能提供进一步的启发。

答案 1 :(得分:0)

您没有描述很多限制,因此我假设它只是您所追求的简单复制操作。 “最好的方式”有点模糊,我不知道你在比较什么。您唯一需要注意的是执行创建新实体,复制数据和删除事务中的旧实体的实际工作。这很容易做到,并且会阻止您在出现问题时创建重复项。

远程API shell绝对是编写代码最少的方法。您可以编写简单的python函数来执行事务副本,并在shell中运行它。您不需要编写任何额外的处理程序,甚至不需要部署新版本的应用程序。远程shell的问题在于访问数据存储区的速度可能要慢100倍,因此可能需要很长时间。如果你让它一夜之间运行,如果你的网络连接出现打嗝,它可能会停止 - 尽管如果你在一个交易中复制你的实体这不应该是一个大问题,你可以重新启动操作。作为参考,我最近通过远程API运行了一个操作,上传了6000个实体,大概花了5分钟。如果你可以让操作在一夜之间运行,这可能是要走的路,除非你有> 100K实体。

mapreduce API方法运行得更快,因为负载将分散在多个实例中。设置mapreduce需要付出更多的努力,你必须使用该功能部署一个新版本的应用程序,启动它,等到它完成,然后清理代码,以及一堆日志记录mapreduce自动生成的实体。