处理非常大的距离矩阵在C(或c++,如果它可以帮助)
Handle very large distance matrix in C (or C++ if it could help)
我在我的软件中用C实现这个聚类算法http://www.sciencemag.org/content/344/6191/1492.full(免费访问版本),我需要建立一个距离矩阵,但在某些情况下,数据集的大小(冗余删除后)是巨大的(n> 1 500 000,甚至更大,在更复杂的情况下高达400 000 000)。我的问题是,即使分配上三角矩阵也会是( (1500000*1500000) - 1500000) * 0.5 * sizeof(float) =~ 5.5e12 Bytes
。因此,内存分配失败(即使在具有256 GB RAM的计算节点上也是如此),在这种情况下不可能写入磁盘。
除了减少数据集的大小(我将看到)群集,有人知道我可以使用一种技术来近似和存储这些信息量吗?
注意:就像我在标题中说的,我正在使用C,我也可以使用c++。另外,如果有人有另一种聚类算法(其中簇的数量是由算法本身决定的)要使用,请建议给我。
提前感谢您的时间,
你可能需要退后一步,重新考虑你的算法。
首先,也许你不需要在所有数据点对之间有距离矩阵。也许您可以将相似的数据点分组到数据桶中,然后创建桶之间的距离矩阵。
也就是说,从计算点之间的成对距离开始,但只保留相对较小的距离和指向"另一个"点的指针。一种很短距离的稀疏矩阵。这很容易并行执行。
然后创建包含点组的数据箱,它们之间的距离较小。例如,如果你设定"短"距离的阈值,那么箱子平均可以容纳50个数据点,你就会得到1500000/50=30000个箱子。
然后再次遍历数据并计算箱子之间的距离。这将产生30000^2个距离,这是一个大约4GB的矩阵。除此之外,你还有30000在箱子里有50^2的距离,也就是另外300MB。这个数据量是很容易管理的。
如果用相应箱子之间的距离替换数据点之间的距离对于您的应用程序来说足够精确,则可以工作。这完全取决于您正在处理的数据类型和应用程序的精度要求。
- 如果没有malloc,链表实现将失败
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- C++擦除(如果存在)
- 如果"new int"返回"int*",那么为什么"new int[n]"不返回"int**"?
- 在'如果'陈述输出如何正确
- 如果用户输入无效,如何使用字符串变量-C++重复输入命令
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 如果基类包含双指针成员,则派生类的构造函数
- 如果没有数学库,我如何在C++中创建复利公式
- 如果我已经有一个头,那么模板(-t)文件属于哪里
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?