在磁盘上实现的 FIFO 队列(或堆栈),而不是 ram(最好在 C++ 中)[关闭]
Posted
技术标签:
【中文标题】在磁盘上实现的 FIFO 队列(或堆栈),而不是 ram(最好在 C++ 中)[关闭]【英文标题】:FIFO queue (or stack) implemented on disk, not ram (preferably in C++) [closed] 【发布时间】:2010-12-09 16:04:19 【问题描述】:基本上我所追求的是标准模板库队列的等效项,该队列以使用磁盘进行存储的方式实现。需要排队的数据量远远大于当今大多数计算机的内存中可以存储的数据量。
理想情况下,我要使用一个库。但是,任何有关如何实施此队列的建议都会很有用。
【问题讨论】:
通常你可以通过拥有一个内存中的句柄堆栈来解决这个问题。 【参考方案1】:你可能想看看STXXL:
“STXXL 的核心是 C++ 标准模板库 STL 的实现,用于外部内存(核外)计算,即 STXXL 实现了可以处理仅适合磁盘的海量数据的容器和算法。 "
【讨论】:
+1 不错的小图书馆。我不知道这存在! 这是一个不错的库。它还支持跨多个磁盘条带化数据。 谢谢。这看起来正是我所需要的。【参考方案2】:您可能想查看STLXX 库。它包含一个基于磁盘的优先级队列,使用 Peter Sanders 描述的“Sequence Heap”模型。
【讨论】:
【参考方案3】:一个疯狂的想法:实现一个分配器类,它从磁盘上的文件读取/写入文件并将其传递给 STL deque
或 queue
或任何适合您需要的东西。
【讨论】:
很酷的想法,除了典型的 STL 容器实现分配器只被调用来分配/释放内存。例如,在普通迭代期间,分配器根本不涉及。并且容器本身不会产生“页面错误”来触发页面加载。 Boost::interprocess 正是这样做的。如果您在使用 Boost 的用户空间中,则一切就绪。【参考方案4】:告诉我们数据。每个项目是大还是小?它是固定大小还是高度可变的?磁盘存储的问题在于,随着项目的大小变得更加多样化,问题开始类似于数据库问题。在这种情况下,您可能应该将 sqllite 数据库之类的东西作为队列的后备存储。然后你就可以用 SQL 拉出第一条记录了。
如果数据真的很大,您可以使用不断递增的文件名将每个对象存储在文件系统上。然后你甚至不需要将队列存储在内存中。文件日期成为您的 FIFO 订单。只需抓取目录中最旧的文件即可将第一项从“堆栈”中拉出。
最后,如果数据小而多,您可以考虑覆盖 std::list 或 std::deque 的分配器。可以在 Allocator 类中隐藏文件 IO。对于小而多的数据实例,我没有简单的解决方案。
【讨论】:
【参考方案5】:这就是队列处理程序的创建者的方式,当然还有构造函数来编写代码
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;
【讨论】:
以上是关于在磁盘上实现的 FIFO 队列(或堆栈),而不是 ram(最好在 C++ 中)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章