【问题标题】:How to quickly reading 72 billion elements from numpy arrays into triangular matrix如何快速将 numpy 数组中的 720 亿个元素读入三角矩阵
【发布时间】: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 进行分布式计算。您将在几分钟内将这么多数据读入内存

标签: python arrays numpy


【解决方案1】:

如何快速将 numpy 数组中的 720 亿个元素读入三角矩阵

你不能这样做

720 亿约为 1011。假设一个元素是一个 64 位字或 8 个字节。这意味着 1012 个字节(在 10 倍以内)。

典型 DDR4 模块的延迟约为每 64 位字 50 纳秒。

算一下。 1012 * 50 ns 是很长的时间。 50K 秒,所以大约半天。

而且 1012 字节的 RAM 成本很高。您可以使用超级计算机吗?

考虑使用一些昂贵的GPGPUOpenCLCuda。凭借运气和大量的编程努力,您可能赢得十倍的收益。

也许您的计算时间可以减少到一小时。

我不知道这在您的文化中是否“快速”。在我的,它不是。

您可能需要数周的开发时间。

【讨论】:

  • 感谢您的回答,巴西尔。这对我来说澄清了很多事情。我想我可能会更幸运地转向更合适的算法。我试图使用字符串距离创建集群,以便使用 Sklearn 的凝聚集群 API 更好地搜索相似的名称。
  • 一小时很快。这是一次性任务。
  • 是的,但开发时间可能需要数周。 OpenCL 是一头猛兽。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多