Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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
Java 如何在1秒之内从GAE数据存储中检索大量(>;2000)实体?_Java_Performance_Google App Engine_Google Cloud Datastore_Google Bigquery - Fatal编程技术网

Java 如何在1秒之内从GAE数据存储中检索大量(>;2000)实体?

Java 如何在1秒之内从GAE数据存储中检索大量(>;2000)实体?,java,performance,google-app-engine,google-cloud-datastore,google-bigquery,Java,Performance,Google App Engine,Google Cloud Datastore,Google Bigquery,我们的应用程序中有一些部分需要加载大量数据(>2000个实体)并在此数据集上执行计算。每个实体的大小约为5 KB 在我们最初的、幼稚的实现中,瓶颈似乎是加载所有实体所需的时间(~40秒,2000个实体)),而执行计算本身所需的时间非常少(这非常有趣,但是的,它可能&Iv看到了一些令人难以置信的结果 我也会这样做;映射减少概念 如果您能为我们提供更多关于您使用了多少并行实例的指标,那就太好了&每个实例的结果是什么 此外,我们的流程包括单独检索还是检索和存储 您的数据存储中有多少个元素?4000?1

我们的应用程序中有一些部分需要加载大量数据(>2000个实体)并在此数据集上执行计算。每个实体的大小约为5 KB


在我们最初的、幼稚的实现中,瓶颈似乎是加载所有实体所需的时间(~40秒,2000个实体)),而执行计算本身所需的时间非常少(这非常有趣,但是的,它可能&Iv看到了一些令人难以置信的结果

我也会这样做;映射减少概念

如果您能为我们提供更多关于您使用了多少并行实例的指标,那就太好了&每个实例的结果是什么

此外,我们的流程包括单独检索还是检索和存储

您的数据存储中有多少个元素?4000?10000?原因是您可以从上一个请求中将其缓存起来


关于

使用。我不能保证它足够,但如果不够,您可能必须移动到另一个平台。

200.000 x 5kb是1GB。您可以将所有这些都保留在后端实例的内存中,或者有多个实例。这将是最快的解决方案-没有什么比内存更好的了

您是否需要每个实体的整个5kb进行计算? 在计算前查询时是否需要所有200000个实体?查询是否涉及所有实体


另外,请查看。它可能适合您的需要。

最后,我们似乎无法在一秒钟内从单个实例检索到>2000个实体,因此我们被迫使用放置在后端实例上的内存缓存,如原始问题中所述。如果有人提出了更好的答案,或者我们找到了更好的strategy/实现对于这个问题,我会更改或更新接受的答案。

我们的解决方案包括定期读取后台任务中的实体,并将结果存储在json blob中。这样我们可以快速返回超过10万行。所有过滤和排序都使用SlickGrid的DataView模型在javascript中完成

正如已经有人评论的那样,MapReduce是GAE的发展方向。不幸的是,MapReduce的Java库对我来说已经坏了,所以我们使用非优化任务来完成所有的阅读,但我们计划在不久的将来让MapReduce(和/或管道API)开始运行


请注意,上次我检查时,Blobstore没有返回大于1MB的GZIP实体,因此目前我们正在从压缩实体加载内容并将其扩展到内存中,这样最终的有效负载就会被GZIP压缩。我不喜欢这样,它会引入延迟,我希望他们尽快解决GZIP问题!

更新了问题,并提供了更多信息n、 你能分享一个你所看到的令人难以置信的结果的例子吗?为什么你需要为一个面向用户的请求检索这么多的实体?你能提供更多关于你实际在做什么的细节吗?我们需要向用户展示一个实体子集,它根据一些输入参数和用户定义的函数提供最大的利润。在在我们的用例中,我们最多只能将搜索空间减少到约2000个实体的子集。正如Peter指出的,您正试图为单用户查询检索gig数据。您需要以某种方式对其进行重组,如果没有更多关于您正在做什么的信息,很难说如何进行。好吧,不是真正的gig,我认为这更重要ke~10 MB。(或者我误解了数据存储的工作方式吗?)数据存储的10 MB/s吞吐量是目前无法达到的吗?我已经用一个我们尝试做的例子更新了这个问题。听起来像是MapReduce问题。这将是非常乐观的。:)5KB是序列化实体的大小,泄气对象将占用内存中该数量的几倍。根据我们的测试,我们估计一个拥有1GB内存的B8后端可以缓存大约40k个实体。从内存缓存中检索~2000个实体非常快(约500毫秒),但将结果从缓存后端发送到请求实例需要几秒钟。我们只需要实体的几个属性,我们的初始查询已将加载的实体数量从200k减少到~2k,并且该查询适用于所有此类实体。查看app engine状态页面,memcache multi-get具有~60 MB/s的吞吐量,可以想象,在1秒之内加载2000个实体@5KB。但我们的应用程序中已经有另一部分大量使用memcache,我们担心这会导致巨大的丢失率,因为缓存逐出会很频繁。我不确定缓存配额是多少(尚未找到确切的数字),但由于最大实体大小是1MB,我猜它比10MB大得多;获取的最大大小也是32 MB。考虑到这些数字,我发现它的大小不太可能小于64 MB(这是非常保守的),可能是64 MB的很多倍。由于配额详细信息面板中发送和检索的数据的统计数据是以GB为单位的,因此我猜对于这种规模的数据来说,驱逐不会是一个问题。这是一个好主意,我认为Memcache提供了一个getStatistics()方法来查询Memcache中所有键和值中存储的总字节数。我将编写一个简单的测试,以了解我的应用程序中的实际限制是什么,但从我在中读取的内容来看,限制可能会在没有警告的情况下发生变化。这一定是一个非常特殊的情况(除非在使用或getStatistics()中出现任何错误),我无法想象缓存通常<10 MB;我是说,有250字节的密钥!这是很久以前的事了,从那时起GAE有了很大的进步。从那以后你有没有找到更好的解决办法?我们刚刚遇到了相同的读取性能瓶颈。@Shell不幸的是,我当时负责这一问题的公司已经从GAE转移到另一家在GAE中不做任何开发的公司,所以我不知道最好的解决方案