gpt4 book ai didi

c++ - 清除 boost::interprocess::map 的更快方法?

转载 作者:IT老高 更新时间:2023-10-28 22:15:25 28 4
gpt4 key购买 nike

我有一个在共享内存中使用 boost::interprocess::map 的应用程序。 map 包含大量元素(100k 到 10M),一切运行良好,但有一个异常(exception): map 必须定期清除,每个元素似乎需要大约 4 µs(因此最坏情况下需要 40 秒),这是 Not Acceptable 应用程序。看起来 clear() 实际上是单独删除每个 map 元素并在每次删除后重新平衡树,所以当你有大量元素时,它的效率非常低。理想情况下 clear() 只会删除所有元素而不进行任何重新平衡 - 有什么方法可以让我自己实现这种优化的 clear() 方法?

(顺便说一句,我也尝试过 boost:interprocess:flat_map - 这具有更快的清除时间,正如预期的那样(快 10 倍),但对于插入/删除操作来说太慢了。 )

注意:earlier question on StackOverflow谈到了在普通(即非共享)内存中较小的 STL 映射的类似问题,但并没有真正解决问题。

最佳答案

通过查看 Boost 代码,我猜你有:

  • 在rbtree的实现中发现了一个bug

  • 使用安全模式或自动取消链接进行编码

来自\boost_1_54_0\boost\intrusive\rbtree.hpp

   //! <b>Effects</b>: Erases all of the elements.
//!
//! <b>Complexity</b>: Linear to the number of elements on the container.
//! if it's a safe-mode or auto-unlink value_type. Constant time otherwise.
//!
//! <b>Throws</b>: Nothing.
//!
//! <b>Note</b>: Invalidates the iterators (but not the references)
//! to the erased elements. No destructors are called.
void clear()
{
if(safemode_or_autounlink){
this->clear_and_dispose(detail::null_disposer());
}
else{
node_algorithms::init_header(this->priv_header_ptr());
this->priv_size_traits().set_size(0);
}
}

这里的评论清楚地表明,您可以从实现的明确中获得恒定的时间。翻阅 boost 代码,我的阅读是 interprocess::map 最终使用这个 rbtree 作为底层数据结构。我没有注意到设置了安全模式或自动取消链接的任何地方,但我可能会错过它。如果你设置了其中一个,我会先看看我是否可以没有它,如果是这样,你的性能问题有望消失。

如果这是 boost 中的错误,您将不得不解决它。我会立即使用标题中的联系信息报告它:

/////////////////////////////////////////////////////////////////////////////
//
// (C) Copyright Ion Gaztanaga 2006-2012
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/intrusive for documentation.
//
/////////////////////////////////////////////////////////////////////////////

快速的 Google 搜索似乎有 Ion 的联系方式:

http://boost.2283326.n4.nabble.com/template/NamlServlet.jtp?macro=user_nodes&user=161440

或转至 http://www.boost.org/development/bugs.html

然后实现 Paul R 或 rileyberton 的解决方案,具体取决于您的性能需求水平。

关于c++ - 清除 boost::interprocess::map 的更快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18829651/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com