过多的数据存储在创建时写入

时间:2012-03-30 14:17:15

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

你昨天就此问了一个问题,现在已经简化了问题,看它是否更容易解决/诊断。

我正在尝试批量创建500个JDO实体,每个实体都有一个“Key”作为主键,两个索引字符串和一个未编制索引的字符串。

当我创建500个实体时,它使用6%的数据存储区写引号(来自500000的引号),这是30000次写操作,相当于每个实体60次写入。在开发服务器上,“write ops”是6,它与关于数据存储区写入的各种注释一致。没有搜索也没有复合索引,我只是创建了500个实体。

那么为什么我的实体需要60? JDO实体如下:

import javax.jdo.annotations.Extension;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Key;

@PersistenceCapable
public class Product {

    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;
    @Persistent
    private String productId;
    @Persistent
    private String productName;

    @Persistent
    @Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
    private String merchantProductId;   

      .
      .// getters and setters here but not included in post
      .
}

在循环中创建了500个实体:

private void createBulkProducts(PrintWriter out){
    int cnt = 0;
    Product tmpProd = null;
    PersistenceManager pm = PMF.get().getPersistenceManager();
    ArrayList<Product> products = new ArrayList<Product>();
    for(cnt = 0; cnt < 500; cnt++){
        tmpProd = createBulkProduct(new Integer(cnt).toString());
        products.add(tmpProd);
    }
    if(products.isEmpty() == false){
        pm.makePersistentAll(products);
        out.println(products.size() + " bulk products committed to database");
    }
    pm.close();
    out.println(cnt + " bulk products inserted");           
}

private Product createBulkProduct(String cnt){
    Product product = new Product();
    product.setMerchantProductId("mid" + cnt);
    product.setProductId("pid" + cnt);
    product.setProductName("the quick brown fox jumps over the lazy dog " + cnt);
    return product;
}

我在GAE 1.6.1上运行

所有帮助/建议非常感谢 克雷格

1 个答案:

答案 0 :(得分:1)

免费应用的每日配额是50k写操作而不是500k。请参阅信息中心,其中应显示n.nn of 0.05 Million Ops

考虑到这一点,所有计算都可以。