我在下面使用了 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/