【问题标题】:How to store a TB size C++ array on a cluster如何在集群上存储 TB 大小的 C++ 数组
【发布时间】:2020-07-23 21:24:35
【问题描述】:

我想做一个巨大的模拟,需要大约 1 TB 的数据来描述一堆相互作用的粒子(每个粒子都有不同的相互作用)。是否可以将这些数据存储在 C++ 数组中?

我可以访问 60 个节点的集群。每个节点有 2 个 48x16GB DDR4 的 CPU。因此,每个节点总共有 192 GB,或 11520 GB = 11 TB 集群上的总 RAM。您将如何在此集群上动态分配 1 TB 数组?

【问题讨论】:

  • 从 C++ 的角度来看,1 TB 的数组理论上不是问题。假设最小元素大小(1 字节)所需的大小是 ~1e+12,它在 x86 ~1.8e19 上的 size_t 范围内。所以球在集群一侧。它使用什么虚拟化、什么操作系统以及它使用什么底层分布式系统来共享 RAM。
  • @bolov:无论每个元素有多大,1 TB 的数据都会消耗 1 TB 的地址空间(请参阅:“一磅羽毛有多重?”)。而 x86_64 上的地址空间远不及 1.8e19 字节,事实上,由于硬件限制(48 位地址,2.8e14 可寻址字节),它远远小于。
  • @JohnZwinck 我的分析是关于是否可以存储数组的大小(在size_t 中)。至于地址空间,有虚拟化和 ds 系统允许您为单个进程访问那么多内存,即使它分布在服务器节点上。
  • 每个节点192GB这个数字是怎么来的? 48 批 16GB 为 768GB

标签: c++ memory-management heap-memory large-data hpc


【解决方案1】:

您有 1 TB 的数据和 11 TB 的总内存。因此,将所有数据存储在集群上是没有问题的,只是如何存储的问题。

您可以将其打包到尽可能少的节点上,即六个节点。或者您可以将其分散到所有 60 个节点上。哪种方法更好取决于很多因素,包括您将使用这些数据的访问模式、集群的成本模型(无论您使用多少节点,它都是免费的吗?)等等。

您需要确定特定集群上每个任务的最大可用内存是多少。这是由集群管理员配置的。例如,某些集群可能会平均分配内存,因此每个节点中的 192 GB RAM 可能仅在您在节点上为核心运行一项任务时才可用,而不是在每个节点运行一项任务时可用。您没有告诉我们有多少个核心,显然我们不知道您的集群的使用策略是什么。

您的 C++ 问题的答案是:是的,您可以在 C++ vectorarraylistmap 或任何其他数据结构中存储 1 TB。 C++ 在这里没有任何限制。

【讨论】:

    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 2015-11-21
    相关资源
    最近更新 更多