我有一个有6个索引的双精度数组,它主要用零填充。我不知道应该用什么类型将它存储在内存中。
但是,最重要的是:
我想将它保存到一个文件(二进制文件?)。
保存它的最有效方法是什么?
一个要求是我可以遍历所有非零条目而不通过零。
如果我运行6个嵌套for
,我将需要太多生命。
此外,我不知道如何实际保存它:我需要两个文件,一个作为索引,第二个是否包含所有值?
谢谢!
答案 0 :(得分:0)
这可能是一个已解决的问题;可能存在稀疏矩阵库,它们也为您提供高效的内存中表示。 (例如,每行是index:value
的列表,存储在std::vector
,链表,散列或其他数据结构中,具体取决于在中间插入单个非零值是否有价值或其他任何其他值操作很重要。)
二进制格式的存储/加载速度会更快,但无论是二进制格式还是文本格式对于表示稀疏数组的某些方式都不重要。如果你编写二进制格式,endian-agnostic code是确保它是可移植的好方法,并且没有只出现在某些架构上的错误。
选项:
简单但有点难看:gzip / lz4 / lzma缓冲区保存多维数组,将结果写入磁盘。保存/加载时动态转换为little-endian,或以格式存储endianness标志。
同样的想法,但每个值存储所有6个索引。如果许多最内部的数组没有非零值,这很好,这可能是好的。每个非零值都有一个单独的记录(行,基于文本的格式)。样本行(三重嵌套示例的可读性,扩展到6就好了):
dimensions on the first line or something
a b c val
...
3 2 5 -3.1416
表示:matrix[3][2][5] = -3.1416
使用嵌套的稀疏数组表示:每一行都是index:value的列表。非现有指数为零。文本格式可以使用空格和换行符来分隔事物;二进制格式可以使用每行开头的长度字段或末尾的sentinel值。
您可以将多维数组展平为一个线性索引,以便存储32位整数索引,或者您可以以某种方式表示嵌套。我不打算为此编写一个文本格式,因为当我开始思考它时它变得很难看。
答案 1 :(得分:0)
6维数组的常规平面表示......
double [10] [10] [10] [10] [10] [10] = 1百万条目* 8字节〜= 8MB
关联数组索引:值表示,假设50%的条目是0.0 ...使用4字节32位索引...
500,000 * 4字节+ 500,000 *字节〜= 6MB
稀疏数组的位图表示,假设50%的条目是0.0 ...位被设置为每个字节代表数组中的8个条目10000001b意味着8个条目,其中只有第一个和最后一个被表示并且6个中间值被忽略,因为它们是零...
ceil(1百万/ 8)字节+ 500,000 * 8字节〜= 4.125MB