哪个 STL 类用于 Rand-In-First-Out-Buffer
Which STL class use for a Rand-In-First-Out Buffer
我目前有一个大集群(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。
相关文章:
- netcat command in c++
- Difference in displaying cv2 Mat
- C++ MFC Libraries in Travis CI
- 为什么我不能将 rand() 与数组的大小一起使用?
- 如何在OpenSSL中从configuration.h.in获取configuration.h
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 为什么新的随机库比std::rand()更好
- IN, OUT, INOUT Parameters
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 有人安装"IITB Simplecpp in mac"吗?
- 从 C 样式字符串中删除子字符串 "in place" 在C++代码中
- 如何修复"error: ‘_1’ was not declared in this scope"?
- C++算法标头中,为什么要使用 "!(val < *first)" ?
- Softmax Implementation in C++
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- c++ in Depth First Search
- rand() in MinGW g++
- 应对"Find the first repeated character in a string"挑战的最紧凑、高效、可读和智能的解决方案
- 哪个 STL 类用于 Rand-In-First-Out-Buffer
- rand() and srand() in C++