【问题标题】:Efficient storage of large matrix on HDD在 HDD 上高效存储大型矩阵
【发布时间】:2014-07-06 10:42:29
【问题描述】:

我有许多 doubles(浮点数)的 1GB+ 大矩阵,其中许多是 0.0,需要有效存储。我打算保留double 类型,因为某些元素确实需要为double(但如果它可以节省大量空间,我可以考虑更改它)。字符串标头是可选的。矩阵没有缺失元素、NaN、NA、空值等:它们都是doubles

有些列会稀疏,有些则不会。稀疏列的比例因文件而异。

什么是 CSV 的节省空间的替代方案?对于我的使用,我需要将这个矩阵快速解析为RpythonJava,因此特定于单一语言的文件格式是不合适的。可能需要按行或按列访问。

我也不是在寻找商业解决方案。

我的主要目标是节省硬盘空间,而不会炸毁io 次。导入后的 RAM 使用情况不是主要考虑因素。

【问题讨论】:

标签: matrix storage sparse-matrix hdd space-efficiency


【解决方案1】:

最重要的问题是您是否总是将整个矩阵扩展到内存中,或者您是否需要随机访问压缩形式(以及如何访问)。扩展更简单,所以我专注于此。

您可以使用位图来说明数字是否存在或为零。每个条目花费 1 位,因此可以在没有零的情况下将文件大小增加1/64,或者在全零的情况下将其缩小到1/64。如果有零的运行,您可以存储后续零的数量和非零的数量,例如,通过将两个 4 位数字打包到一个字节中。

由于double 表示是standard,您可以在两种语言中使用二进制表示。如果您的许多号码实际上是ints,您可以考虑使用I did 之类的号码。

如果连续的数字是相关的,你可以考虑存储它们的差异。

我打算保留 double 类型,因为某些元素确实需要为 double 类型(但如果可以节省大量空间,我可以考虑更改它)。

显然,切换到float 会用半精度换取内存的停止。这可能太不精确了,所以你可以从尾数中省略一些位并得到例如每个条目 6 个字节。或者,您可以将指数减少到单个字节,因为范围 1e-38 到 3e38 就足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 2019-11-04
    • 1970-01-01
    相关资源
    最近更新 更多