为了简单起见,我将一个非常大的2D空间映射到一个简单的位数组(实际上它是大约200k的成员)。
现在让我们说我运行一个小型算法来绘制一个"圈"给出中心点和半径的1
s。
这是一个示例,左侧绘制了一个圆圈,在下一次计算中,它的中心向上移动了1。
0000000 0001000
0001000 0011100
0011100 -> 0011100
0011100 0001000
0001000 0000000
0000000 0000000
现在我有很多这些地图的图层,在我计算出来之后,我需要"展平"它们(有点像Photoshop混合图层选项) - 目前我每次都在整个阵列上进行迭代并组合整个阵列 - 尽管其中95%都没有真正改变。
Psuedo代码
for(int x = 0; x < width; x++)
for(int y = 0; y < height; y++)
int index = x + y * width
result[index] = layer1[index] * layer2[index]
这非常低效,我需要提高我的表现。
更新:我们最终做了什么
稀疏矩阵完全我们需要的东西,我们最终使用最适合我们使用的键字典(DOK)(动态构建每一层和&# 34;混合&#34;他们在一起)。
我们提出的解决方案是使用3个阵列:
由于我们的需求严重依赖于内存使用和CPU,我们将每个稀疏矩阵包装成双缓冲区形式,以便不为每个混合生成新数组。
最终,这个解决方案为我们带来了x15-x20更好的CPU结果(比我们之前的天真蛮力方法),并且在内存方面我们将RAM使用率降低了大约98%。
答案 0 :(得分:1)
根据我的理解,并使用photoshop图层类比:
你有你的潜在“图像”,存储为“密集的”2D阵列,当然,因为这是你的数据,每个“像素”都很重要。到目前为止一切都很好。
额外的图层代表小更改:当表示为2D数组时,其条目的几乎所有都将为零。
在这种情况下,您需要查看稀疏矩阵表示:您只需存储记录非坐标的元组sudo yum install python-devel
列表,而不是存储完整的2D数组。 - 零细胞。
这样,在这些矩阵上运行的任何算法都将按照有多少非零的顺序运行,而不是基于矩阵的总条目数。