【问题标题】:C++ bad-alloc errorC++ 错误分配错误
【发布时间】:2014-04-28 09:03:33
【问题描述】:

我需要找到 10000 个点的数据集的所有对距离。我正在使用向量在 C++ 中编码来存储点。这是我的向量:

vector <vector <double> > data.
vector <vector <double> > dist.

我正在从文件中读取输入数据并存储在数据中。然后我计算所有对的距离并将其存储在 dist 中。

它适用于高达 8000 点的小型数据集。但是当我为更大的数据集运行相同的代码时,我收到以下错误:

在抛出 'std::bad_alloc' 的实例后调用终止

what(): std::bad_alloc

中止(核心转储)。

我上网了,但找不到解决办法。请帮我解决这个问题。

【问题讨论】:

  • 在 8000 个点的情况下,您有 6400 万个双精度向量,每个向量至少需要 512MB。可能你的内存不够用大数据集。
  • 操作系统不想给你的程序更多的内存。可能是因为你消耗的太多了。
  • 对于数据集的每个点,你有多少个 double?很明显,您的内存不足。您必须问自己的问题:我使用的内存是否超出了我的需要?有没有办法用更少的内存捕获数据?
  • 你是在 32 位运行吗?

标签: c++ vector bad-alloc large-data


【解决方案1】:

您使用的内存过多,并且向量似乎无法分配此内存。

如上所述,如果仅考虑双精度值,则每个向量大约有 512 MB 内存(std::vector 类也有一些内部变量和 vfptable ,您分配了 8000 次)。

std:vector 的习惯是每次超过预先分配的限制时都会增加它的大小,以防止在每个添加的新元素上重新分配昂贵的元素。

所以向量的真实大小总是大于其中元素的数量。

尝试管理自己的记忆来处理如此大的数字,尤其是如果您从一开始就知道元素的数量。

当您不知道要添加多少元素时,std:vector 非常有用,而且对于 6400 万个元素的大小肯定不是:)。

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多