不一致的应用程序引擎数据存储vs我知道它应该是从解析相同的数据源本地



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

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

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

我想我可能把数据存储写得太多了;我将任务队列的速率设置为50/s。我确实发现了一些书写错误,但还不足以证明这4000美元的差异。是否有可能我过于匆忙地进行计数调用,从而导致不一致?将处理任务队列的速度降低到5/s这样的速度是否能解决问题?谢谢。

你可以很容易地计算你的实体(没有任务,几乎是免费的):

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);
更新:

如果像我建议的那样循环太长,你可以为每100/500/1000个实体旋转一个任务——这绝对比为每个实体创建一个任务更有效。在Java中,即使是非常复杂的计算,如果处理得当,也只需要几毫秒。

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

最新更新