Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine GAE数据存储结构_Google App Engine_Database Design_Optimization_Google Cloud Datastore - Fatal编程技术网

Google app engine GAE数据存储结构

Google app engine GAE数据存储结构,google-app-engine,database-design,optimization,google-cloud-datastore,Google App Engine,Database Design,Optimization,Google Cloud Datastore,我已经使用Google App Engine几个月了,最近我开始怀疑我在数据存储方面的一些做法。我有大约10个实体,每个实体有10-12个属性。在我的应用程序中,一切都很好,代码也很简单,我的数据结构也很简单,但我想知道我是否应该将这些大型实体拆分为较小的实体,以优化读写操作,或者只是为了遵循关于GAE的最佳实践,我不确定这一点 现在,我已经超过了读写配额,希望能够控制这些配额。我建议考虑使用NDB实体。如果需要,NDB将在对数据存储执行读/写操作之前使用上下文内缓存和Memcache。这将有助

我已经使用Google App Engine几个月了,最近我开始怀疑我在数据存储方面的一些做法。我有大约10个实体,每个实体有10-12个属性。在我的应用程序中,一切都很好,代码也很简单,我的数据结构也很简单,但我想知道我是否应该将这些大型实体拆分为较小的实体,以优化读写操作,或者只是为了遵循关于GAE的最佳实践,我不确定这一点


现在,我已经超过了读写配额,希望能够控制这些配额。

我建议考虑使用NDB实体。如果需要,NDB将在对数据存储执行读/写操作之前使用上下文内缓存和Memcache。这将有助于你保持在你的配额之内

有关NDB如何使用缓存的更多信息,请阅读此处:


有关GAE最佳实践的讨论,请参阅本页:

我建议您研究使用NDB实体。如果需要,NDB将在对数据存储执行读/写操作之前使用上下文内缓存和Memcache。这将有助于你保持在你的配额之内

有关NDB如何使用缓存的更多信息,请阅读此处:


有关GAE最佳实践的讨论,请参阅本页:

AppEngine数据存储对每个读取的实体收取固定金额的费用,无论该实体有多大,尽管最大容量为1MB。这意味着将您经常一起阅读的多个实体合并为一个实体是有意义的。缺点是延迟会增加,因为每次都需要反序列化一个更大的实体。我发现这个延迟非常低,即使是大的延迟也只有1位数毫秒


在数据存储上使用框架是一个好主意。我正在使用Objectify,我非常高兴。不过要小心使用Memcache集成。Google只为每个应用程序提供固定的有限内存量,因此,只要您谈论较大的数据,这并不能解决您的问题,因为实体已从Memcache中移出,每次读取都需要从数据存储中重新读取并再次放入缓存。

AppEngine数据存储对每个实体读取收取固定的费用,无论实体有多大,尽管最大容量为1MB。这意味着将您经常一起阅读的多个实体合并为一个实体是有意义的。缺点是延迟会增加,因为每次都需要反序列化一个更大的实体。我发现这个延迟非常低,即使是大的延迟也只有1位数毫秒

在数据存储上使用框架是一个好主意。我正在使用Objectify,我非常高兴。不过要小心使用Memcache集成。Google只为每个应用程序提供固定的有限内存量,因此,只要您谈论较大的数据,这并不能解决您的问题,因为实体已从Memcache中移出,每次读取都需要从数据存储中重新读取并再次放入缓存。

优化读取:

如果在查询中使用偏移,则偏移图元将计为读取。如果在offset=100的位置运行查询,则数据存储将检索并丢弃前100个实体,并为这些读取向您计费。尽可能使用游标以减少读取操作。游标还将导致更快的查询

在运行查询时,NDB不一定会减少读取。对数据存储进行查询并返回实体,不会发生memcache交互。如果您想在查询上下文中从memcache检索实体,则需要运行一个仅限键的查询,然后尝试从memcache检索这些键。然后,您需要转到数据存储,查找任何缓存未命中的实体。检索密钥是一个很小的操作,其成本是读取操作的1/7

优化写入:

删除未使用的索引。默认情况下,实体上的每个属性都会编制索引,其中每个属性在第一次写入时会发生2次写入,在修改时会发生4次写入。可以对如下属性禁用索引:firstname=db.StringPropertyindexed=False

如果使用列表属性,则列表中的每个项都是实体上的单个属性。列表属性是为了方便而提供的抽象。名为things的列表属性值为[thing1,thing2]实际上是数据存储中的两个属性:things\u 0=thing1和things\u 1=things。当与索引相结合时,这会变得非常昂贵

合并不需要查询的属性。如果只需要查询一个或两个属性,请序列化其余属性并将其作为blob存储在实体上

进一步阅读:

优化内容如下:

如果在查询中使用偏移,则偏移图元将计为读取。如果您在offset=100的位置运行查询,数据存储将检索并丢弃前100个实体,并且您将为这些实体付费 她读着。尽可能使用游标以减少读取操作。游标还将导致更快的查询

在运行查询时,NDB不一定会减少读取。对数据存储进行查询并返回实体,不会发生memcache交互。如果您想在查询上下文中从memcache检索实体,则需要运行一个仅限键的查询,然后尝试从memcache检索这些键。然后,您需要转到数据存储,查找任何缓存未命中的实体。检索密钥是一个很小的操作,其成本是读取操作的1/7

优化写入:

删除未使用的索引。默认情况下,实体上的每个属性都会编制索引,其中每个属性在第一次写入时会发生2次写入,在修改时会发生4次写入。可以对如下属性禁用索引:firstname=db.StringPropertyindexed=False

如果使用列表属性,则列表中的每个项都是实体上的单个属性。列表属性是为了方便而提供的抽象。名为things的列表属性值为[thing1,thing2]实际上是数据存储中的两个属性:things\u 0=thing1和things\u 1=things。当与索引相结合时,这会变得非常昂贵

合并不需要查询的属性。如果只需要查询一个或两个属性,请序列化其余属性并将其作为blob存储在实体上

进一步阅读:


事实上,我在大约两个月前把所有的东西都转换成了NDB,这确实起了作用。关于最佳实践的良好链接tooI实际上在大约两个月前将所有内容都转换为NDB,这肯定会有所不同。关于最佳实践的良好链接非常感谢您的确认。是的,我注意到了memcache的一些限制,但总的来说,它是一个大的读取节省器。你知道Python的Objectify吗?非常感谢你的确认。是的,我注意到了memcache的一些限制,但总的来说,它是一个大的读取节省器。你知道Python的Objectify吗?进一步阅读我没有在回答中发布两个以上链接的街头信誉:进一步阅读我没有在回答中发布两个以上链接的街头信誉: