Google app engine App Engine数据存储中的不一致性与我知道的本地解析同一数据源时的不一致性

Google app engine App Engine数据存储中的不一致性与我知道的本地解析同一数据源时的不一致性,google-app-engine,google-cloud-datastore,Google App Engine,Google Cloud Datastore,这可能是一个微不足道的问题,但我只是希望从那些可能比我更了解这方面的人那里获得一些实际经验 我想从一系列非常大的XML文件中生成一个GAE数据库——作为验证的一种形式,我在计算GAE数据存储的统计数据,我知道应该有16000个实体,但当我进行计数时,我得到的数据大约是12000个 我进行计数的方式基本上是执行一个过滤器,获取包含1000个实体的页面,然后为每个实体(使用其键)启动任务队列。然后,每个任务队列向我存储的计数器添加“1” 我想我可能是把数据存储写得太多了;我将任务队列的速率设置为50

这可能是一个微不足道的问题,但我只是希望从那些可能比我更了解这方面的人那里获得一些实际经验

我想从一系列非常大的XML文件中生成一个GAE数据库——作为验证的一种形式,我在计算GAE数据存储的统计数据,我知道应该有16000个实体,但当我进行计数时,我得到的数据大约是12000个

我进行计数的方式基本上是执行一个过滤器,获取包含1000个实体的页面,然后为每个实体(使用其键)启动任务队列。然后,每个任务队列向我存储的计数器添加“1”


我想我可能是把数据存储写得太多了;我将任务队列的速率设置为50/s。。我确实犯了一些书写错误,但还不足以证明4000个差异的合理性。有没有可能是因为我过于匆忙地计算电话而导致不一致?将我处理任务队列的速度降低到5/s可以解决问题吗?谢谢

您可以非常轻松地计算实体(无任务,几乎免费):

int-total=0;
查询q=新查询(“实体种类”).setKeysOnly();
//在此查询上设置筛选器
查询结果列表;
游标=空;
FetchOptions queryOptions=FetchOptions.Builder.withLimit(1000).chunkSize(1000);
做{
如果(光标!=null){
查询选项。startCursor(光标);
}
结果=数据存储、准备(q)、查询结果列表(查询选项);
合计+=结果。大小();
cursor=results.getCursor();
}而(results.size()==1000);
System.out.println(“总实体:“+Total”);
更新:

如果像我建议的那样循环需要太长时间,你可以为每100/500/1000个实体旋转一个任务——这肯定比为每个实体创建一个任务更有效。在Java中,即使是非常复杂的计算,如果正确完成,也需要毫秒


例如,每个任务都可以检索一批实体,旋转一个新任务(并将查询光标传递给这个新任务),然后继续计算。

为什么每个实体都需要一个任务来计算它???我需要从每个实体中提取其他数据来计算其他统计数据,这些统计数据可能非常大,然后使用我建议的代码,如果需要实际提取实体,只需删除“setKeysOnly()”。我还更新了我的答案。你没有说你是如何积累统计数据的,如果你使用并行任务,你确定你一直在更新你的计数器(即无序写入)。任务队列的加速真的会有这样的性能损失吗?我同意这是没有必要的,但我的运气太差了,GAE关闭了任务,所以我试图尽可能多地将它们分开。这是我能想到的解决GAE问题的唯一方法。是的,比必要的任务多旋转100-1000倍是一个严重的性能损失。如果您有16个(甚至32个)任务而不是16000个,那么您就不必担心处理速度。顺便说一句,我从来没有遇到过任务方面的问题。他们对我的工作一如预期。
int total = 0;
Query q = new Query("entity_kind").setKeysOnly();
// set your filter on this query

QueryResultList<Entity> results;
Cursor cursor = null;
FetchOptions queryOptions = FetchOptions.Builder.withLimit(1000).chunkSize(1000);

do {
    if (cursor != null) {
        queryOptions.startCursor(cursor);
    }
    results = datastore.prepare(q).asQueryResultList(queryOptions);
    total += results.size();
    cursor = results.getCursor();
} while (results.size() == 1000);

System.out.println("Total entities: " + total);