mongodb - 分配策略 usePowerOf2Sizes 如何工作?

标签 mongodb padding allocation

似乎allocation strategy usePowerOf2Sizes 对集合的填充因子没有影响。有没有我遗漏的东西或者这是一个错误?是否有示例说明 usePowerOf2Sizes 对填充因子的影响?

我尝试了以下实验:

  1. 将几个文档插入到 mongodb。
  2. 随机挑选几个文件,改变它们的大小,然后保存。
  3. 检查集合的填充因子。
  4. 重复步骤 2 和 3 几次,观察填充因子。

我预计这个集合的结果填充因子对于精确匹配分配策略会比对于 2 大小分配策略的小。

然而,无论使用何种分配策略,我真正观察到的是相同的填充因子。

这是我使用的代码(针对 mongo 版本 2.6.4):

function randomChoice(arr) {
    return arr[getRandomInt(0, arr.length)]
}

function getRandomInt(min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
}

function prepare(count, usePowerOf2Sizes) {
    db.aaa.drop();
    db.aaa.createIndex({"i": 1})

    for (var i=0; i<count; i++) {
        db.aaa.insert({"i": i});
    }
    db.runCommand({"collMod": "aaa", "usePowerOf2Sizes" : usePowerOf2Sizes })
}

function changeSizes(actionCount) {
    vals = [100, 150, 225, 340, 500, 760, 1200].map(function (n) {return Array(n + 1).join("a")})

    count = db.aaa.count()

    for (var i=0; i<actionCount; i++) {
        d = db.aaa.find({"i": getRandomInt(0, count)})[0];
        d["a"] = randomChoice(vals);
        db.aaa.save(d);
    }
}

function runPaddingTest(documentCount, usePowerOf2Sizes, actionCount, iterations) {
    prepare(documentCount, usePowerOf2Sizes);
    print("Use padding:", db.aaa.stats().userFlags)
    print("Padding:", db.aaa.stats().paddingFactor)
    d1 = new Date().getTime();
    for(var i=0; i<iterations; i++) {
        changeSizes(actionCount);
        print("Padding:", db.aaa.stats().paddingFactor)
    }
    d2 = new Date().getTime();
    print("Millis:", d2-d1)
}

示例输出:

// 100 documents, power of 2 sizes allocation strategy, 7*300 document changes
> runPaddingTest(100, true, 300, 7);
Use padding: 1
Padding: 1
Padding: 1.1840000000000002
Padding: 1.1800000000000068
Padding: 1.1360000000000148
Padding: 1.0660000000000238
Padding: 1.0050000000000323
Padding: 1
Padding: 1
Millis: 2661

// 100 documents, exact allocation strategy, 7*300 document changes
> runPaddingTest(100, false, 300, 7);
Use padding: 0
Padding: 1
Padding: 1.2129999999999992
Padding: 1.224000000000005
Padding: 1.1750000000000131
Padding: 1.1150000000000215
Padding: 1.0430000000000303
Padding: 1
Padding: 1
Millis: 2641

// 1000 documents, power of 2 sizes allocation strategy, 7*300 document changes
> runPaddingTest(1000, true, 300, 7);
Use padding: 1
Padding: 1
Padding: 1.451999999999991
Padding: 1.8189999999999849
Padding: 1.999
Padding: 1.9980000000000002
Padding: 2
Padding: 1.999
Padding: 1.9980000000000002
Millis: 2730

// 1000 documents, exact allocation strategy, 7*300 document changes
> runPaddingTest(1000, false, 300, 7);
Use padding: 0
Padding: 1
Padding: 1.447999999999991
Padding: 1.784999999999986
Padding: 1.9980000000000002
Padding: 1.999
Padding: 2
Padding: 1.999
Padding: 1.999
Millis: 2728

最佳答案

我认为填充因子与 usePowerOf2Sizes 无关。对于 2 大小的幂,为记录的新位置(对于需要文档移动的插入或更新)分配的空间(以字节为单位)类似于

2^ceiling(log_2(bsonsize(record))

即大于文档大小的最小二乘方。对于精确拟合分配策略,空间为

padding factor * bsonsize(document)

填充因子是 1 到 2 之间的某个数字,MongoDB 根据它看到集合中文档的增长方式自动调整。请注意,这不是填充多少的经验度量,只是对在不久的将来应该使用多少填充的一些猜测,并且它与 2 大小的幂无关。我不知道它是如何计算的——你必须阅读代码——但不同的分配策略导致不同的记录大小这一事实导致磁盘上不同的文档模式和更新时文档移动的模式意味着当对使用不同分配策略创建的同一集合执行相同操作时,填充因子不同也就不足为奇了。

关于mongodb - 分配策略 usePowerOf2Sizes 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27194017/

相关文章:

javascript - 通过C将数据从JavaScript发送到Mongodb

CSS自动为无序列表添加填充和边距

css - 像边距或填充之类的东西,除了不绘制背景的地方

html - 在 IE 中填充文本输入...可能吗?

node.js - 比较和排序 Node 中的 MongoDB ObjectID - 转换为字符串?

ruby-on-rails - 并发和 Mongoid

java - Morphia 中的复杂 AND-OR 查询

c++ - FMOD Ex 内存分配问题

c++ - new with inheritance 的不当使用?

c++ - 如何在结构中动态分配内存?