我正在Google App Engine上构建网络抓取工具。要将已爬网的信息存储在Data Store中,我使用JDO使用以下字段。守则如下:
public class LinkInfo
{
@PrimaryKey
@Persistent private String id;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent private int linkNo;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent private String link;
@Persistent private int version;
@Persistent private String fetchDate;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent private long fetchTime;
@Persistent private String nextFetch;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent private String pageCreationDate;
@Persistent private int retries;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent private int retryInterval;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent private int outLinks;
@Persistent private float score;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent private String abstractContent;
@Persistent private String contentType;
@Persistent private String parent;
@Extension(vendorName="datanucleus", key="gae.unindexed", value="true")
@Persistent private String title;
...
在16个字段中,我做了8个未索引的索引,因为我不需要对它们进行过滤或排序。即使是现在,我也超过了数据存储区写操作限制。
通过“数据存储区写操作”减少的任何建议?
答案 0 :(得分:6)
来自Google App Engine:
对于每个新的实体投放:
" 2每个索引属性值写入+ 2次写入,每个复合索引值写入1次写入。"
因此,对于每个实体,您将拥有2 + 2 * 8 +(无论您拥有多少个自定义索引)。
每个实体至少18个。
减少写入次数的最佳方法是减少索引属性的数量。
答案 1 :(得分:1)
你可以做很多事情来减少写入...假设你没有经常更新数据。它的内容是您可以通过缓存进行优化。根据你的例子,这是一个非常直接的表,没有连接,所以如果你只是在那里存储数据,你可以做的不多。保存数据时,每个条目是否看到多个写入?
我唯一要建议的是完全放弃JDO,只需通过本机API写入数据存储区,以便在JDO采取多个操作来持久保存对象时真正优化写入,但实际上,它不应该比你自己做的要糟糕得多。