【问题标题】:Reduce Datastore Write Operations减少数据存储写入操作
【发布时间】:2012-04-02 21:14:59
【问题描述】:

我正在 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 个未编入索引,因为我不需要对它们进行过滤或排序。即使是现在,我也超过了数据存储区写入操作限制。

通过“数据存储写入操作”减少的任何建议?

【问题讨论】:

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


    【解决方案1】:

    来自 Google App Engine:

    对于每个新的实体放置:

    “2 次写入 + 每个索引属性值 2 次写入 + 每个复合索引值 1 次写入。”

    因此,对于每个实体,您将拥有 2+2*8+(无论您拥有多少自定义索引)。

    每个实体至少有 18 个。

    减少写入次数的最佳方法是减少索引属性的数量。

    【讨论】:

      【解决方案2】:

      如果您不经常更新数据,那么您无能为力来减少写入次数。您可以通过缓存进行优化。根据您的示例,这是一个非常简单的表,没有连接,因此如果您只是在其中存储数据,那么您无能为力。保存数据时,您是否看到每个条目的写入次数超过几次?

      如果 JDO 需要多次操作来持久化一个对象,我唯一建议的是完全放弃 JDO,只通过本机 API 写入数据存储区以真正优化您的写入,但实际上,它不应该比你自己做的还要糟糕。

      【讨论】:

      • 我看到大约 80 个条目的近 2500 个操作。 JDO 和本机 API 代码在没有写入操作方面有区别吗?我想了解更多。但我同意 Native API 比 JDO 更快,而 JDO 更易于使用,根据这个讨论link
      • 本机 API 在最小化调用方面要快得多。你可能想看看 objectify 哪个更接近原生层,恕我直言,比 jdo 更容易
      • 谢谢你,我会尝试使用 Native API,希望可以。
      • 谢谢,使用 Native API,结果比 JDO 快。但写入操作的数量几乎保持不变。
      • 您知道写入是否针对索引吗?您的索引文件中是否定义了任何额外的索引?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多