c++ - Boost MultiIndex Container,如何为快速插入做延迟索引?

标签 c++ performance boost

我在下面使用了 MultiIndexContainer

typedef multi_index_container<PositionSummary*,
        indexed_by<
                ordered_unique<
                        composite_key<PositionSummary, const_mem_fun<PositionSummary, int, &PositionSummary::positiondate>,
                                const_mem_fun<PositionSummary, const std::string&, &PositionSummary::accountid>,
                                const_mem_fun<PositionSummary, const std::string&, &PositionSummary::instid> > >,
                ordered_unique<
                        composite_key<PositionSummary, const_mem_fun<PositionSummary, int, &PositionSummary::positiondate>,
                                const_mem_fun<PositionSummary, const std::string&, &PositionSummary::instid>,
                                const_mem_fun<PositionSummary, const std::string&, &PositionSummary::accountid> > > 
                    > > PositionSummaryContainer;

然后我插入了10000次*36个账号*100天=3600万条记录

//Begin testing of the multiIndexContainter
std::cout << "Begin inserting data from array into the multiIndexContainter" << std::endl;
timer.reset();
timer.begin();
for (int i = 0; i < numOfDays_; i++)
{
    for (int j = 0; j < accountSize_; j++)
    {
        for (int k = 0; k < instSize_; k++)
        {
            PositionSummary* ps = psArray_[(i * accountSize_ + j) * instSize_ + k];
            uniqueIndex.insert(ps);
        }
    }

}

printMemoryUsage();
timer.end();
std::cout << "Time take is " << timer.getInterval() << std::endl;

而且我发现插入的速度有点慢,大约每秒20K+条记录......有没有办法 boost 这个插入速度? 我的数据在 Oracle 中,索引正确,因此应该没有损坏数据结构的危险。我知道在 oracle 中你可以先加载然后构建索引以节省时间,如果有办法的话,我可以用 MultiIndexContainer 做同样的事情吗? 顺带一提,并行查询速度还是比较令人满意的,在一台4cpu(8kernal)的机器上查询全部36m的记录只需要2.8秒,代码如下

#pragma omp parallel for collapse(2)
    for (int i = 0; i < numOfDays_; i++)
    {

        for (int j = 0; j < accountSize_; j++)
        {
            const int& date = dates_[i];
            const std::string& accountID = accountIDs_[j];
            for (int k = 0; k < instSize_; k++)
            {
                const std::string& instID = instIDs_[i];
                PositionSummaryContainer::iterator it = uniqueIndex.find(boost::make_tuple(date, accountID, instID));
                if (it != uniqueIndex.end())
                {
#pragma omp atomic
                    sum2 += (*it)->marketvalue();
                }
            }
            //std::cout << "accountID: " << accountID << std::endl;
        }

    }

最佳答案

啊,我想我找到了 key 。很简单。

psContainer_.insert(&psArray_[0], &psArray_[accountSize_ * instSize_ * numOfDays_]);

现在插入速度从 53 秒减少到 5.29 秒。十倍 boost 。我认为 boost 作者知道他们使用这种方式进行了一些批量插入,只是我没有注意到。

Boost 是一个很棒的库,但文档不是很详尽。

关于c++ - Boost MultiIndex Container,如何为快速插入做延迟索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28522468/

相关文章:

java - ArrayList 与 char[]。对于构建大字符串来说这是最有效的

c++ - boost::spirit::x3 中的通用解析器生成器

php - 查找包含特定项目的目录的最快方法

c# - 将 C++ 代码(使用指针和位移)转换为 C#

c++ - 列表功能 C++

c++ - 如何填充 vector <vector <Foo*>>?

R 使用值作为索引的有效方法

c++ - 将 IP 地址添加到 NIC 的跨平台方式(使用 C++)

c++ - 当主应用程序处于 while 循环时,boost 线程未运行

c++ - 线程竞争期间读取会影响写入吗?