哪个 STL 类用于 Rand-In-First-Out-Buffer

Which STL class use for a Rand-In-First-Out Buffer

本文关键字:Rand-In-First-Out-Buffer 用于 STL 哪个      更新时间:2023-10-16

我目前有一个大集群(50+台计算机)处理工作包。然后,控制器计算机收集所有这些工作包结果。

因此,假设数据以半随机的方式到达,并逐渐增长:

0,2,3,8,7,1,4,9,10,11,6, ...

然后,我必须按顺序将数据转储到文件中。由于工作包是 100M+,一旦我在缓冲区中准备好下一个工作包,我就会转储它们。

我实际上正在为这个"随机输入优先输出"使用std::map,例如:

std::map<int, DataStruct> buffer;
long long next_work = 0;
while(next_work != 100000000){
    fill_buffer(buffer); //This method fills the buffer from the processing elements
    if(buffer.find(next_work) != buffer.end()){
        dump_to_file(buffer[next_work]); // Dumps it to file
        buffer.erase(next_work++);
    }
};

此缓冲区有时(由于网络滞后,PC滞后,断开连接等)增长到100000+个元素,这会减慢操作速度。所以,我想知道STL是否有更好的类来应对这种类型的操作。

在这里使用std::map合适吗?

有没有更好/CPU效率的方法?(我真的不在乎它是否具有内存效率)

由于缓冲区中没有少于 next_work 的作业,因此映射只能包含这样一个元素作为其第一个元素。你可以改用begin()来访问你的迭代器,在常量时间内获得第一个元素(然后测试它是否是你想要的元素)。但仍然减慢的是插入,在缓冲区的当前大小中仍然是对数的。

另一种关联数据结构是哈希映射。它支持预期的恒定时间插入和查找。它不是按键排序的,但由于您只需要查找一个确切的键,因此不会成为问题。

如果您的编译器支持 C++11

(并且您不需要支持 C++11 之前的编译器),则std::unordered_map .可能只是替换类就可以解决所有问题。也许您需要调整对数据结构的其他访问,这些访问未显示在截取的代码中,即我们不知道您如何在fill_buffer中填充数据结构。

对于C++03,您可以尝试boost::unordered_map。