【问题标题】:Entity prepopulation for MongoDB to avoid padding with SpringMongoDB 的实体预填充以避免使用 Spring 填充
【发布时间】:2016-12-05 19:15:39
【问题描述】:

在一个应用程序中,我使用buckets 的概念来存储对象。所有存储桶在创建时都是空的。其中一些可能会在 2 小时内填满 20 个对象的最大容量,一些在 6 个月内。每个对象的大小几乎是固定的,即我不希望它们的大小差异超过 10%,即完整存储桶的大小也不会。实现看起来与此类似。

@Document
public class MyBucket {
  // maximum capacity of 20
  private List<MyObject> objects;
}

保持padding factor 较低的一种方法是使用虚拟数据预先填充我的存储桶。我想到了两个选择:

  1. 使用虚拟数据创建存储桶,保存它,然后重置其内容并再次保存
  2. 使用虚拟数据创建存储桶并将其标记为“原始”。在第一次写入时,标志设置为 false 并且数据被重置。

缺点很明显,选项 1 需要两次数据库写入,选项 2 需要我的实体中的额外(非业务)代码。

可能我不会用任何解决方案便宜地下车。不过,有任何关于该问题的实际经验、任何最佳实践或提示吗?

设置:Spring Data MongoDB 1.9.2、MongoDB 3.2

【问题讨论】:

  • 您能否更详细地解释一下问题到底是什么,您用填充因子解决了什么问题?
  • 我想避免的情况如下:我在几天内创建了 100.000 个初步空桶。我知道这些桶中有 80% 会在一年内增长到创建时的 20 倍。如果我不预先填充这些存储桶,它们很快就会有 4 的填充因子,这会导致内存使用效率非常低、大量重定位和空间浪费。我知道有压缩或修复之类的选项,但我会通过告诉 MongoDB 它可以预期哪些文档大小来避免这种情况。

标签: java spring mongodb padding


【解决方案1】:

据了解,您主要关心的是与文档大小增加相关的性能开销,从而导致文档重定位和索引更新。 mmapv1 存储引擎是实际的,但是由于 MongoDB 版本 3.0 有可用的 WiredTiger 存储引擎,没有此类问题(查看类似的question)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 2012-12-04
    • 2017-09-06
    • 2016-07-24
    • 2016-07-11
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多