【问题标题】:mongodb string less space than floatmongodb字符串的空间比float少
【发布时间】:2011-09-27 02:54:48
【问题描述】:

在 mongodb 中保存字符串是否真的比浮点数占用更少的空间?

所以如果我有一个更新的时间字段,而不是将时间保存为浮点数,我应该将其保存为字符串?

有什么理由让我不想这样做?

谢谢。

【问题讨论】:

  • 您的意思是像这样保存浮点数:“21.234”?嗯,那是 6 个字节,我认为浮点数可以是 4 或 8,那么这个怎么样? “9248.2837291092739”?
  • 我不认为 String 占用的空间比 float...

标签: mongodb node.js


【解决方案1】:

不,这不是真的。浮点数使用 8 个字节存储,因此无论数字大小如何,它始终是 8 个字节。字符串是可变长度的,因此数字的字符串表示将占用所需的字节数。

但是,这并不意味着当字符串表示少于八个字符时,您可以通过使用字符串来节省空间。还有字符串长度和空终止符形式的开销,即五个字节。 "2.1" 需要比数字2.1 更少的字节来表示,但是一旦超过五个字符,字符串将需要更多空间。如果您将数字保存为四字节整数,则字符串表示不能更小。

这可以通过在mongo shell 中输入以下命令来查看:

> Object.bsonsize({a: 2.1})
16
> Object.bsonsize({a: "2.1"})
16
> Object.bsonsize({a: 2.11})
16
> Object.bsonsize({a: "2.11"})
17

2.1"2.1" 大小相同,因为字符串是三个字符长,加上三个字节的开销,使其大小与八字节浮点数相同(其他八个字节是对象的开销和键)。将数字更改为2.11 不会更改大小,但"2.11" 会增加一个字节。

您可以在规范中找到BSON格式的不同数据类型的确切字节大小:http://bsonspec.org/#/specification

【讨论】:

    【解决方案2】:

    如果您真的很在意空间,并且存储一些简单的东西(只有几个小数位,范围有限),您可以将其乘以 10、100... 并将其存储为 int32。

    【讨论】:

    • 所以 int32 小于字符串?
    • 嗨,我会的。但是,为了知识,您能解释一下原因吗?大小有什么区别?谢谢
    • 这很简单。 int32 是 4 个字节。一个字符串包含一个 4 字节长度的标头、字符串和终止的零字节。所以像“2.2”这样的字符串占用4+3+1=8个字节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多