App Engine数据存储区的不一致性与我所知道的应该是在本地解析相同的数据源

时间:2014-05-26 21:57:15

标签: google-app-engine google-cloud-datastore

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

我想通过一系列非常大的XML文件在GAE中生成数据库 - 作为一种验证形式,我正在计算GAE数据存储区的统计数据,我知道应该有~16,000个实体,但是当我执行时伯爵,我的订单数量达到了12,000。

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

我想我可能会对数据存储区写得过多;我将任务队列的速率设置为50 / s。我确实得到了一些写入错误,但还不足以证明4,000个差异。我是否有可能过多地匆忙计算电话会导致不一致?将我处理任务队列的速度降低到5 / s之类的速度会减慢这个问题吗?谢谢。

1 个答案:

答案 0 :(得分:3)

您可以非常轻松地统计您的实体(没有任务,几乎是免费的):

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中花费几毫秒。

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