基本的に私が求めているのは、ストレージにディスクを使用するような方法で実装された標準テンプレート ライブラリ キューと同等のものです。キューに入れる必要があるデータの量は、現在のほとんどのコンピューターの RAM に格納できる量よりもはるかに多くなります。
理想的には、使用するライブラリを求めています。ただし、このキューを実装する方法に関する推奨事項は役に立ちます。
STXXLを見たいと思うかもしれません:
「STXXL のコアは、外部メモリ (コア外) 計算用の C++ 標準テンプレート ライブラリ STL の実装です。つまり、STXXL は、ディスクにのみ収まる膨大な量のデータを処理できるコンテナーとアルゴリズムを実装しています。」
奇想天外なアイデア: ディスク上のファイルを読み書きするアロケータ クラスを実装し、それを STLdeque
またはqueue
必要に応じて何でも渡します。
これは、キューハンドラーの作成者が行く方法ですもちろん、コーディングするコンストラクターがあります
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;
}
データについて教えてください。各項目は大きいですか、小さいですか。それは固定サイズですか、それとも大きく変動しますか? ディスク ストレージの問題は、項目のサイズが多様化するにつれて、問題がデータベースの問題に似てくることです。その場合、キューのバッキング ストアとして sqllite データベースのようなものを調べる必要があります。次に、SQL を使用して最初のレコードを引き出すことができます。
データが非常に大きい場合は、インクリメントするファイル名を使用して各オブジェクトをファイルシステムに保存できます。その後、キューをメモリに保存する必要さえありません。ファイルの日付が FIFO 注文になります。ディレクトリ内の最も古いファイルを取得して、最初のアイテムを「スタック」から取り出します。
最後に、データが小さく多数の場合は、std::list または std::deque の Allocator をオーバーライドすることを検討してください。Allocator クラスでファイル IO を非表示にできる場合があります。小規模で多数のデータ インスタンスに対する簡単な解決策がありません。