【发布时间】: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 较低的一种方法是使用虚拟数据预先填充我的存储桶。我想到了两个选择:
- 使用虚拟数据创建存储桶,保存它,然后重置其内容并再次保存
- 使用虚拟数据创建存储桶并将其标记为“原始”。在第一次写入时,标志设置为 false 并且数据被重置。
缺点很明显,选项 1 需要两次数据库写入,选项 2 需要我的实体中的额外(非业务)代码。
可能我不会用任何解决方案便宜地下车。不过,有任何关于该问题的实际经验、任何最佳实践或提示吗?
设置:Spring Data MongoDB 1.9.2、MongoDB 3.2
【问题讨论】:
-
您能否更详细地解释一下问题到底是什么,您用填充因子解决了什么问题?
-
我想避免的情况如下:我在几天内创建了 100.000 个初步空桶。我知道这些桶中有 80% 会在一年内增长到创建时的 20 倍。如果我不预先填充这些存储桶,它们很快就会有 4 的填充因子,这会导致内存使用效率非常低、大量重定位和空间浪费。我知道有压缩或修复之类的选项,但我会通过告诉 MongoDB 它可以预期哪些文档大小来避免这种情况。
标签: java spring mongodb padding