r - 为什么R中的逻辑( boolean 值)需要4个字节?

标签 r memory boolean

对于一个逻辑值 vector ,当位 vector 每个条目消耗1位时,为什么R分配4个字节? (有关示例,请参见this question。)

现在,我意识到R还可以促进NA值的存储,但是不能通过附加位 vector 来实现吗?换句话说,为什么仅使用便宜的两位数据结构还不够?

值得一提的是,Matlab使用1字节进行逻辑运算,尽管它不利于NA值。我不确定MathWorks为什么不对一位功能感到满意,更不用说两位数据结构了,但是他们有花哨的行销人员……[我要在这个问题上尽力而为“两位” 。 ;-)]

更新1.我认为提供的体系结构原因是有道理的,但是事后有点。我没有检查32位或16位R来查看它们的逻辑大小-这可能会给这个想法提供一些支持。从the R Internals manual看来,每个平台上的逻辑 vector (LGLSXP)和整数(INTSXP)均为32位。我可以理解整数的通用大小,而与单词大小无关。同样,逻辑的存储似乎也与字长无关。但是,它是如此之大。 :)

此外,如果字长参数如此强大,那么看到Matlab(我认为它是32位Matlab)仅消耗1个字节,这对我来说似乎很奇怪-我想知道MathWorks是否选择了更高的内存效率并通过权衡编程复杂性以及其他用于查找子单词对象的开销。

另外,当然还有其他选择:正如Brian Diggs所指出的那样,bit包促进了位 vector 的处理,这对于上述问题非常有用(通过从4字节的logical转换而获得8X-10X的任务加速)值到位 vector )。尽管访问内存的速度很重要,但是将30-31个额外的非信息位(从信息论的 Angular 来看)是浪费的。例如,可以使用诸如用于整数described here的内存技巧之类的东西-抢一堆额外的内存(V单元),然后在位级别处理事物(la bit())。为什么不这样做,并为长 vector 保存30位(值1,NA 1)?

由于我的RAM和计算速度受 bool(boolean) 值的影响,我打算切换到使用bit,但这是因为在某些情况下节省97%的空间很重要。 :)

我认为这个问题的答案将来自对R的设计或内部有更深入了解的人。最好的例子是Matlab的逻辑使用不同的大小,在这种情况下,内存字的大小将无法解决。就其值(value)而言,Python可能类似于R。

与此相关的一种表达方式可能是:为什么LGLSXP在所有平台上都为4字节? (CHARSXP通常较小,并且不能正常工作吗?为什么不变得更小,而只是分配过多?)与整数一样有用,例如CHARSXP。使用与字符相同的数据结构可以节省空间,但会限制哪些现有方法可以对其进行操作。更适当的考虑是使用较小的整数,如下所述。)

更新2。这里有一些非常好的和启发性的答案,特别是关于为了实现速度和编程效率的目标应如何实现 bool(boolean) 的检索和处理。我认为Tommy的答案特别合理,因为它为什么在R中以这种方式出现,这似乎来自两个前提:

  • 为了支持在逻辑 vector 上加法(请注意,“逻辑”是由编程语言/环境定义的,与 bool(boolean) 值不同),最好通过重用代码来添加整数来实现。对于R,整数消耗4个字节。对于Matlab,最小的整数是1个字节(即CHARSXP)。这可以解释为什么为逻辑写一些不同的东西会很麻烦。 [对于不熟悉R的人,它支持许多逻辑上的数值运算,例如sumint8等。]
  • 传统的支持使其很难做,除了很长时间以来在R和S-Plus中所做的之外。此外,我怀疑在S,S-Plus和R的早期,如果有人执行大量 bool(boolean) 运算,那么他们会在C中执行它们,而不是尝试在R中使用逻辑进行大量工作。

  • 对于如何实现更好的 bool(boolean) 处理的目的,其他答案非常好-不要天真地假设一个人可以得到任何单个位:加载一个单词然后掩盖不感兴趣的位是最有效的,因为Dervall已经描述过。这应该是非常非常有用的建议,应该为R的 bool(boolean) 运算编写专门的代码(例如,我对交叉表的问题):不要遍历位,而要在字级上工作。

    感谢所有人提供的非常详尽的答案和见解。

    最佳答案

    了解R和S-Plus的一些知识后,我会说R最有可能做到了与S-Plus兼容,而S-Plus最有可能做到了,因为这是最容易做的事...

    逻辑 vector 基本上与整数 vector 相同,因此sum和其他用于整数的算法在逻辑 vector 上的工作几乎没有变化。

    在64位S-Plus中,整数是64位,因此也是逻辑 vector !每个逻辑值8个字节...

    @Iterator当然是正确的,逻辑 vector 应以更紧凑的形式表示。由于已经存在一种1字节的raw vector 类型,因此将其也用于逻辑似乎是一个非常简单的更改。每个值2位当然更好-我可能会将它们保留为两个单独的位 vector (TRUE / FALSE和NA / Valid),如果没有NA,则NA位 vector 可能为NULL ...

    无论如何,这主要是一个梦想,因为那里有太多的RAPI程序包(使用R C / FORTRAN API的程序包)会破坏...

    关于r - 为什么R中的逻辑( boolean 值)需要4个字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9178254/

    相关文章:

    ios - 获取函数的地址 [Swift 3.0]

    c++ - 连续内存

    javascript - boolean JavaScript

    r - 如何获得 RPART 模型中树的深度?

    r - 在 map 上的 ggplot2 中按面积比较城市

    c++ - 长时间运行的 C++ 应用程序中的内存泄漏

    c++ - 将字符串传递给 bool 函数

    r - 从 dplyr 中的日期范围计算每年的观测值

    r - 如何使用PCA对高度相关变量进行时间序列预测?

    c++ - C++ 如何检查 std::ios 对象的真值?