【发布时间】:2021-01-06 14:17:05
【问题描述】:
我有几个 1D numpy 数组,大小从 600,000,000 到 150,000,000 个元素不等。
我想将所有这些元素写入大小为 ~381K x 381K 的 numpy 数组的上三角形。
我使用了 np.triu_indices。它破坏了我的记忆。
然后我创建了一个自定义迭代器来获取三角形矩阵索引,如下所示:
def generate_triangular_mat_gen(n_words):
xgen_iters = chain(*[repeat(x, n_words - 1 - x) for x in range(n_words - 1)])
ygen_iters = chain(*[range(x+1, n_words) for x in range(n_words-1)])
return xgen_iters, ygen_iters
这种方法效果很好。但是,一次读取 1 个元素并复制到 numpy 数组位置很慢。大概需要一天左右的时间。
有没有一种方法可以快速从迭代器中一次性获取 600,000,000 个元素。这应该确实减少了计算时间。
【问题讨论】:
-
计算时间可能不是这里的问题。存储 8 字节值(例如整数)的 381k x 381k 数组将以原始上三角形形式占用约 600GB 的空间。你有那么大的记忆力吗?您要存储哪些元素?可以将数据存储在稀疏矩阵中吗?
-
这些是字符串距离。我正在尝试对客户名称进行聚类以加快搜索速度。
-
您可以使用超级计算机吗?哪个?请在您的问题中提供一些minimal reproducible example,并详细说明您可用的硬件
-
无监督聚类可以在数据的随机子样本上表现良好。我建议尝试寻找另一种方法来解决这个问题,除非你有一个系统来处理这么多的存储/内存。
-
您可能希望考虑使用 Hadoop 和 Spark 进行分布式计算。您将在几分钟内将这么多数据读入内存