在HDD上高效存储大型矩阵

时间:2014-05-18 11:23:01

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

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

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

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

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

我的主要目标是节省硬盘空间而不会耗尽io次。导入后的RAM使用率不是主要考虑因素。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

  

我坚持保留double类型,因为某些元素确实需要为double(但我可以考虑更改它,如果它可以导致显着的空间节省)。

显然,切换到float会交换半精度来暂停内存。这可能太不精确了,所以你可以省略一些来自mantisa的比特并得到例如每个条目6个字节。或者,您可以将指数减少到单个字节,而1e-38到3e38的范围就足够了。