我有许多doubles
(浮动)的大型1GB +矩阵,其中许多是0.0
,需要高效存储。我坚持保留double
类型,因为某些元素确实需要double
(但我可以考虑更改它,如果它可以导致显着的空间节省)。字符串标头是可选的。矩阵没有缺失元素,NaN,NA,空值等:它们都是doubles
。
有些列会稀疏,有些则不会。稀疏列的比例因文件而异。
CSV的节省空间的替代方案是什么?对于我的使用,我需要快速将此矩阵解析为R
,python
和 Java
,因此特定于单一语言的文件格式不合适。访问可能需要按行或列进行。
我也不是在寻找商业解决方案。
我的主要目标是节省硬盘空间而不会耗尽io
次。导入后的RAM使用率不是主要考虑因素。
答案 0 :(得分:1)
最重要的问题是,如果您始终将整个矩阵扩展到内存中,或者您需要随机访问压缩形式(以及如何)。扩展更简单,所以我专注于此。
您可以使用位图来说明数字是否存在或为零。每个条目的成本为1比特,因此在没有零的情况下可以将文件大小增加1/64
,或者在全零的情况下将文件大小缩小到1/64
。如果存在零,则可以存储以下零的数量和非零的数量,例如,通过将两个4位数字打包到一个字节中。
由于double
表示为standard,您可以在两种语言中使用二进制表示。如果您的许多号码实际上是int
,那么您可以考虑使用I did。
如果连续数字相关,您可以考虑存储它们的差异。
我坚持保留double类型,因为某些元素确实需要为double(但我可以考虑更改它,如果它可以导致显着的空间节省)。
显然,切换到float
会交换半精度来暂停内存。这可能太不精确了,所以你可以省略一些来自mantisa的比特并得到例如每个条目6个字节。或者,您可以将指数减少到单个字节,而1e-38到3e38的范围就足够了。