1

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

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

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

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

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

4

1 回答 1

1

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

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

由于double表示是标准的,您可以在两种语言中使用二进制表示。如果你的许多数字实际上是ints,你可以考虑像我一样的东西。

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

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

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

于 2014-05-27T21:21:04.537 回答