我正在用C编写一个数值模拟程序。模拟的一部分是空间固定的节点,它们对每个其他节点都有一些浮点值。它就像有向图。但是,如果两个节点距离太远(比某些截止长度a更远),则该值为0.
为了表示所有这些“相关性”或浮点值,我尝试使用2D数组,但由于我有100.000个以上的节点,这对应于40GB内存左右。
现在,我正在尝试为这个问题考虑不同的解决方案。我不想将所有这些值保存在硬盘上。我也不想在飞行中计算它们。一个想法是某种稀疏矩阵,就像在Matlab中可以使用的那样。
您还有其他想法,如何存储这些值?
我是C的新手,所以请不要期待太多的经验。
谢谢和最诚挚的问候, Jan Oliver
答案 0 :(得分:4)
平均而言,在给定节点的截止距离内有多少节点决定了您的内存要求,并告诉您是否需要寻呼到磁盘。占用最少内存的解决方案可能是将一对节点映射到一定距离的哈希表。由于每个方向的距离相同,因此您只需将其输入哈希表一次 - 将两个节点编号按数字顺序排列,然后将它们组合以形成哈希键。您可以将Posix hsearch / hcreate / hdestroy函数用于哈希表,尽管它们不太理想。
答案 1 :(得分:2)
稀疏矩阵方法听起来很理想。 Wikipedia article on sparse matrices讨论了几种实施方法。
答案 2 :(得分:2)
稀疏邻接矩阵是一个想法,或者你可以使用邻接列表,允许你只存储比你的截止值更接近的边。
答案 3 :(得分:1)
您还可以为每个节点保留一个列表,其中包含与此节点相关的其他节点。然后,您将拥有2 * k 的总列表条目数,其中 k 是虚拟矩阵中非零值的数量。
与允许随机访问的“真实”矩阵相比,在速度/性能方面仍然可以接受将整个系统实现为散列/集合/映射的组合。
编辑:此解决方案是稀疏矩阵实现的一种可能形式。 (另请参阅下面的Jim Balter的说明。谢谢你,Jim。)
答案 4 :(得分:0)
如果可能,您确实应该使用稀疏矩阵。在scipy中,我们支持稀疏矩阵,所以你可以在python中玩,虽然说实话,稀疏支持仍然有粗糙的边缘。
如果您可以访问matlab,那肯定会更好ATM。
如果不使用稀疏矩阵,你可以考虑使用基于memap的数组,这样你就不需要40 Gb的RAM,但它仍然很慢,只有你的稀疏程度很低才真正有意义(假设你的100000x100000矩阵中有10-20%的物品中有物品,那么完整的阵列实际上会比稀疏矩阵更快,甚至可能占用更少的空间。