2009-10-24 13 views
6

基本的には、標準のテンプレートライブラリキューに相当し、ディスクをストレージとして使用するように実装されています。キューに入れる必要があるデータの量は、今日のほとんどのコンピュータのRAMに保存できる容量よりはるかに大きいです。FIFO(またはスタック)はディスクではなくRAM(好ましくはC++)で実装されています

理想的には、私は使用するライブラリの後です。ただし、このキューを実装する方法に関する推奨事項は有用です。

+1

をコーディングするコンストラクタがあり、もちろん行く方法です。 – MSalters

答えて

9

あなたはSTXXLで見たいと思うかもしれません:

「STXXLのコアは、外部メモリ用のC++標準テンプレートライブラリSTLの実装(アウトオブコア)の計算である、すなわち、STXXLは、コンテナを実装し、ディスクに収まる膨大な量のデータを処理できるアルゴリズム」

+2

+1すてきな小さなライブラリ。私はこれが存在するのを知らなかった! – dirkgently

+0

これは素晴らしいライブラリです。また、複数のディスクにまたがるデータのストライピングもサポートしています。 –

+0

ありがとうございます。それはまさに私が必要とするもののように見えます。 – Adam

1

野生のアイデア:ディスク上のファイルを読み書きするアロケータクラスを実装し、STL dequeまたはqueueなど、必要に応じてそれらに渡します。

+0

一般的なSTLコンテナ実装アロケータは、メモリを確保/解放するためにのみ呼び出される点を除いて、素晴らしいアイデアです。たとえば、通常の反復処理では、アロケータはまったく関与しません。また、コンテナ自体はページの読み込みをトリガーする「ページフォールト」を生成しません。 – AnT

+0

Boost :: interprocessはこれを正確に行います。 Boostを使用しているユーザスペースにいる場合は、すべて設定されています。 – hackworks

2

STLXXライブラリを調べるとよいでしょう。これには、Peter Sandersが記述した "Sequence Heap"モデルを使用したディスクベースの優先度キューが含まれています。

0

データについて教えてください。各項目は大小ですか?それは固定サイズか非常に可変ですか?ディスクストレージの問題は、アイテムのサイズがさらに大きくなるにつれて、問題がデータベースの問題に似ています。その場合は、キューのバッキングストアとしてsqlliteデータベースのようなものを調べるべきでしょう。その後、SQLを使用して最初のレコードを取り出すことができます。

データが本当に大きい場合は、増分ファイル名を使用して各オブジェクトをファイルシステムに保存するだけです。次に、キューをメモリに格納する必要はありません。ファイルの日付がFIFOの順番になります。ディレクトリ内の最も古いファイルを取得し、最初の項目を「スタック」から取り出します。

最後に、データが小さい場合は、std :: listまたはstd :: dequeのAllocatorをオーバーライドすることを検討してください。 AllocatorクラスのファイルIOを非表示にすることができます。私は、小規模かつ多数のデータインスタンスに対して単純なソリューションを持っていません。

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; 
       } 
関連する問題