FIFO队列(或堆栈)在磁盘上实现,而不是ram(最好是在C ++中)

时间:2009-10-24 03:58:58

标签: c++ c queue disk

基本上我所追求的是相当于以使用磁盘进行存储的方式实现的标准模板库队列。需要在队列中的数据量远远大于今天大多数计算机的RAM。

理想情况下,我正在使用库。但是,有关如何实现此队列的任何建议都很有用。

5 个答案:

答案 0 :(得分:9)

您可能需要查看STXXL

“STXXL的核心是用于外部存储器(核外)计算的C ++标准模板库STL的实现,即STXXL实现了可以处理仅适合磁盘的大量数据的容器和算法。 “

答案 1 :(得分:2)

您可能需要查看STLXX库。它包含使用Peter Sanders描述的“Sequence Heap”模型的基于磁盘的优先级队列。

答案 2 :(得分:1)

一个疯狂的想法:实现一个分配器类,它读取/写入磁盘上的文件并将其传递给STL dequequeue或任何适合您需要的文件。

答案 3 :(得分:0)

告诉我们有关数据的信息。每个项目是大还是小?它是固定大小还是高度可变?磁盘存储的问题在于,随着项目的大小变得越来越大,问题开始变得越来越像数据库问题。在这种情况下,您应该将sqllite数据库视为队列的后备存储。然后你可以使用SQL来拉出第一条记录。

如果数据非常大,您可以使用递增的文件名将每个对象存储在文件系统上。那你甚至不需要将队列存储在内存中。文件日期将成为您的FIFO订单。只需抓取目录中最旧的文件,将第一个项目从“堆栈”中拉出。

最后,如果数据很小且很多,您可以考虑覆盖std :: list或std :: deque的Allocator。可以在Allocator类中隐藏文件IO。我没有针对小型和众多数据实例的简单解决方案。

答案 4 :(得分:0)

这就是队列处理程序的创建者当然会有编译器的构造函数

if(p[i].printerq.size()>0)
                {
                    temp_int=p[i].printerq.back().getPid();
                    counter=0;
                    cout<<"Ready to continue?"<<endl;
                    system("pause");
                    system("cls");
                    cout<<"Printer "<<i+1<<endl<<endl;
                    do
                    {
                        if(counter==3)
                        {
                            cout<<"Ready to continue?"<<endl;
                            system("pause");
                            system("cls");
                            counter=0;
                        }
                        cout<<p[i].printerq.front();
                        p[i].printerq.push(p[i].printerq.front());
                        p[i].printerq.pop();
                        ++counter;
                    }while(temp_int!=p[i].printerq.front().getPid());
                    if(p[i].printerq.size()>1)
                    {
                        cout<<p[i].printerq.front();
                        p[i].printerq.push(p[i].printerq.front());
                        p[i].printerq.pop();
                    }
                }
                else
                {
                    cout<<"Printer "<<i+1<<" is empty."<<endl;
                }