2015-10-26 26 views
1

我有一个有6个索引的双精度数组,它大部分都是用零填充的。我不知道我应该用什么类型将它存储在内存中。如何在C++中有效地将稀疏数组保存到文件中?

但是,最重要的是: 我想将它保存到一个文件(二进制文件?)。 什么是最有效的方法来保存它? 一个要求是我可以在不通过零的情况下运行所有​​非零的条目。 如果我运行6嵌套for我需要太多的生命。

此外,我不知道如何实际保存它:我是否需要两个文件,一个充当索引,另一个充当所有值?

谢谢!

+2

我不不了解效率ent,但一个简单的方法可能是使用'std :: map',如果找不到密钥,假设它的值为0. –

+2

你可以使用周围的众多数据压缩算法之一,即使是简单的应该也可以去除大量的零。 –

+0

你可以直接把它写成二进制文件。这可能比试图停止写作,计算并再次写入更有效。请记住:运动中的磁盘想要保持运动。 –

回答

0

这可能是一个解决的问题;有可能是稀疏矩阵库,也可以为您提供有效的内存表示。 (例如,每行是index:value的列表,存储在std::vector,链表,散列或其他数据结构中,取决于在中间插入单个非零值是有价值的还是其他任何其他操作是重要的)。


二进制格式将以更快的速度存储/加载,而是你是否去二进制或文本不是代表稀疏数组的一些方法很重要。如果你编写二进制格式,endian-agnostic code是确保它是可移植的并且没有只在某些体系结构中才出现的错误的好方法。

选项:

  • 简单,但那种丑陋:gzip的/ LZ4/LZMA缓冲牵着你的多维数组,将结果写到磁盘。在保存/加载时转换为小端序列,或者以格式存储序列标志。

  • 相同的想法,但存储所有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的列表。非现值指数为零。文本格式可以使用空格和换行符分隔事物;二进制格式可以在每行的开始处使用长度字段或在末尾使用标记值。

    您可以将多维数组展平为一个线性索引以存储32位整数索引,或者您可以以某种方式表示嵌套。我不打算为此编写一个文本格式,因为当我开始考虑它时,它变得很难看。

0

6维数组的常规平面表示...

双[10] [10] [10] [10] [10] [10] = 100万个条目* 8个字节〜= 8MB

关联数组指数:值表示,假设条目50%的0.0 ...使用4字节的32位索引...

500000个* 4个字节+ 500000 *字节〜= 6MB

稀疏数组的位图表示,假设50%的条目为0.0 ...位,因此每个字节代表数组中的8个条目10000001b将表示8个条目,其中只有第一个和最后一个被表示和6个中间值将被忽略,因为它们是零...

小区(100万/ 8)字节+ 500000 * 8个字节〜= 4.125MB

相关问题