【问题标题】:C++ - Load Very Large Dataset on RAMC++ - 在 RAM 上加载非常大的数据集
【发布时间】:2013-10-16 14:11:05
【问题描述】:

对于一个项目,我必须处理 30 GB 的数据集。我可以使用一个非常强大的超级计算机,它可以让我将所有数据集存储在 RAM 内存中,以便对其进行计算(我需要整个数据集来实现我必须实现的一些算法)。问题是加载数据集仍然很慢。

我想请您提供一些实用的建议来加快这个过程。我的想法是将加载过程划分为 C++11 显式线程,这些线程将根据线程索引加载单独的数据块。我也听说过 STXXL 库,但它似乎处理核外计算,因此没有在 RAM 上加载数据(我想避免这种情况,因为我有必要的 RAM——我想我可能会得到通过在其上加载数据集可以更快地获得结果)。

【问题讨论】:

  • 你在使用内存映射吗?
  • @seanmcl 你到底是什么意思?
  • 类似于 mmap 的东西。 (en.wikipedia.org/wiki/Memory-mapped_file)。请告诉我们您尝试过的速度太慢了。
  • 嗯,实际上到目前为止还没有。我只有一个串行 C++ 代码,它加载数据并在上面做一些事情。
  • 如果我理解正确,对于内存映射文件,您的意思是与使用 STXXL 库类似的方法:避免将数据加载到 RAM 上并执行计算,将其留在硬盘上。对吗?

标签: c++ dataset ram


【解决方案1】:

个人资料。找出程序的哪个部分花费的时间最多,然后优化该部分。其他一切都是微优化。

您可能希望将程序分成至少 2 个线程,也许是 3 个。线程 1 负责读取数据并放入缓冲区。线程 2 负责执行计算,包括解析输入缓冲区并将结果放入输出缓冲区。线程 3 将从输出缓冲区获取数据并显示它。

您可能需要多个输入缓冲区,具体取决于输入数据的速度。两个就足够了,三个或更多可以给计算更多时间。这个想法是输入线程正在填充一个缓冲区,而计算线程正在处理另一个缓冲区。计算完成后,从下一个缓冲区开始;与阅读线程类似。

您的另一个瓶颈可能是从内存中获取数据。在网上搜索“数据缓存优化 C++”。这是一个微优化,除非您正在获取和处理大量数据。

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2020-08-30
    相关资源
    最近更新 更多