首先,我的代码:
// Reads the index
bi::managed_mapped_file file(bi::open_or_create, indexFile.c_str(), bf::file_size(indexFile.c_str()));
allocator_t alloc(file.get_segment_manager());
rtree_t * rtree_ptr = file.find_or_construct<rtree_t>("rtree")(params_t(), indexable_t(), equal_to_t(), alloc);
std::cout << "The index contains " << rtree_ptr->size() << " entries." << std::endl;
std::ifstream inf(transFile.c_str());
std::string line;
while(getline(inf,line))
{
transition t = transition(line);
point A;
A.set<0>(t.getQ1mz()-1);
A.set<1>(t.getQ3mz()-1);
A.set<2>(0.3);
A.set<3>(0.2);
value_t v = std::make_pair(A,t);
rtree_ptr->insert(v);
rtree_ptr->remove(v);
}
std::cout << "Finished. The index now contains " << rtree_ptr->size() << " entries." << std::endl;
它从内存映射文件中读取R树。然后,它读取一个输入文件transFile
,从其内容中制作十个所谓的“过渡”对象,并将它们插入树中。紧接着,它会删除它们。这是一个无用的案例,但它很好地说明了删除步骤不起作用的问题。我得到的输出是:
The index contains 339569462 entries.
Finished. The index now contains 339569472 entries.
很明显,树的大小增加了十倍,因为十个插入就像一个魅力;但如果删除工作正常,那么树的大小应该与以前相同,但事实并非如此。
我遵循了关于从描述here的R树中删除值的语法,并且所有编译都正确,但由于某些奇怪的原因,它只是不删除该值。我的猜测可能是因为它按值删除,它可能只是找不到要删除的值,但它怎么可能因为该值是刚刚插入一行的值?