R:减少位数/精度以节省 RAM?

HOS*_*JFL 5 r

我的 R 中的 RAM 用完了,data.table 包含 ~100M 行和 40 列全双打。我天真的想法是我可以通过降低精度来减少数据表的对象大小。逗号后不需要 15 位数字。我通过四舍五入来玩,但正如我们所知

round(1.68789451154844878,3)
Run Code Online (Sandbox Code Playgroud)

 1.6879999999999999
Run Code Online (Sandbox Code Playgroud)

并没有帮助。因此,我将值转换为整数。但是,如下面的小示例所示,对于数值向量,从 8000040 字节到 4000040 字节仅减少了 50%,并且在进一步降低精度时,这种减少不会再增加。

有没有更好的方法来做到这一点?

set.seed(1)
options(digits=22)

a1 = rnorm(10^6)
a2 = as.integer(1000000*(a1)) 
a3 = as.integer(100000*(a1)) 
a4 = as.integer(10000*(a1)) 
a5 = as.integer(1000*(a1)) 

head(a1)
head(a2)
head(a3)
head(a4)
head(a5)
Run Code Online (Sandbox Code Playgroud)

[1] -0.62645381074233242  0.18364332422208224 -0.83562861241004716  1.59528080213779155  0.32950777181536051 -0.82046838411801526
[1] -626453  183643 -835628 1595280  329507 -820468
[1] -62645  18364 -83562 159528  32950 -82046
[1] -6264  1836 -8356 15952  3295 -8204
[1] -626  183 -835 1595  329 -820
Run Code Online (Sandbox Code Playgroud)

object.size(a1)
object.size(a2)
object.size(a3)
object.size(a4)
object.size(a5)
Run Code Online (Sandbox Code Playgroud)

8000040 bytes
4000040 bytes
4000040 bytes
4000040 bytes
4000040 bytes
Run Code Online (Sandbox Code Playgroud)

Avr*_*ham 1

不是这样的,不。在 R 中,整数占用 4 个字节,双精度数占用 8 个字节。如果为 1M 整数分配空间,则必然需要 4M 字节的 RAM 来存储结果向量。