有哪些好的做法可以帮助防止 unordered_maps 和向量中的 std::bad_alloc?
What are some good practices to help prevent std::bad_alloc in unordered_maps and vectors?
所以我正在制作一个读取 10,000 行代码的程序。我有一个 unordered_map 向量,每一行都向 unordered_map 添加数据(以新密钥的形式或向其中一个向量添加额外数据)。
对于每一行,我都使用 emplace 存储数据。例如,我有一个
vector <int> temp;
我在使用中存储数据
temp.push_back(someInt);
然后将该向量存储在我的 unordered_map 中
uList.emplace(someKey, temp);
temp.clear();
或者我使用
将数据添加到地图矢量之一
uList[i].push_back(someInt);
这种情况每行发生多次,然后我转到下一行并重新做一遍,10,000 次。
我得到的错误是
"terminate called after throwing an instance of 'std::bad_alloc'"
我假设这是因为我的 unordered_map 或我拥有的向量分配内存时出现问题。
我的问题是:如果我使用 .emplace() 次数太多,unordered_map 是否会在分配内存时出现问题,是否有任何常见做法可用于防止向量分配错误或无序地图?
感谢任何建议,即使是骂我说些蠢话也会有所帮助!
我认为这里没有足够的内容来了解您为什么会得到 bad_alloc。通常它只是意味着您 运行 内存不足。
我的第一个想法是,您的分配比您想象的要多得多,这存在逻辑问题。我还想知道是否为无序映射生成的哈希值很差,导致您插入更多元素而不是更新现有元素的列表。
我的建议:post 更完整的示例,或添加一些 debugging/tracing 以查看在您的数据结构中创建和存储了多少项目。
此外,您的进程在终止前消耗了多少内存?具有虚拟内存的操作系统上的现代(尤其是 64 位)进程 运行ning 可以在失败之前分配大量内存。更有可能达到 32 位的限制,但仍然相当可观。
所以我正在制作一个读取 10,000 行代码的程序。我有一个 unordered_map 向量,每一行都向 unordered_map 添加数据(以新密钥的形式或向其中一个向量添加额外数据)。
对于每一行,我都使用 emplace 存储数据。例如,我有一个
vector <int> temp;
我在使用中存储数据
temp.push_back(someInt);
然后将该向量存储在我的 unordered_map 中
uList.emplace(someKey, temp);
temp.clear();
或者我使用
将数据添加到地图矢量之一uList[i].push_back(someInt);
这种情况每行发生多次,然后我转到下一行并重新做一遍,10,000 次。
我得到的错误是
"terminate called after throwing an instance of 'std::bad_alloc'"
我假设这是因为我的 unordered_map 或我拥有的向量分配内存时出现问题。
我的问题是:如果我使用 .emplace() 次数太多,unordered_map 是否会在分配内存时出现问题,是否有任何常见做法可用于防止向量分配错误或无序地图?
感谢任何建议,即使是骂我说些蠢话也会有所帮助!
我认为这里没有足够的内容来了解您为什么会得到 bad_alloc。通常它只是意味着您 运行 内存不足。
我的第一个想法是,您的分配比您想象的要多得多,这存在逻辑问题。我还想知道是否为无序映射生成的哈希值很差,导致您插入更多元素而不是更新现有元素的列表。
我的建议:post 更完整的示例,或添加一些 debugging/tracing 以查看在您的数据结构中创建和存储了多少项目。
此外,您的进程在终止前消耗了多少内存?具有虚拟内存的操作系统上的现代(尤其是 64 位)进程 运行ning 可以在失败之前分配大量内存。更有可能达到 32 位的限制,但仍然相当可观。