2009-10-24 14 views
6

Temel olarak, saklamak için diski kullanacak şekilde uygulanan Standart Şablon Kütüphanesi sırasının eşdeğeridir. Kuyrukta olması gereken veri hacmi, günümüzde çoğu bilgisayarın ram bölümünde depolanabileceğinden çok daha büyüktür.Diskte uygulanan FIFO kuyruğu (veya yığını), ram değil (tercihen C++)

İdeal olarak, kullanacak bir kitaplığın peşindeyim. Ancak, bu sıranın nasıl uygulanacağına dair herhangi bir tavsiye yararlı olacaktır.

+1

Genellikle bu çözebilir koduna kurucunun var kuyruk işleyici bir yaratıcısı elbette gidecek nasıl. – MSalters

cevap

9

Sen STXXL bakmak isteyebilirsiniz:

"STXXL çekirdek yani harici bellek (out-of-çekirdek) hesaplamaları için C++ standart şablon kütüphanesi STL bir uygulamasıdır, STXXL kapları uygular ve Yalnızca disklere uyan büyük hacimli verileri işleyebilen algoritmalar. "

+2

+1 Güzel küçük kütüphane. Bunun olduğunu bilmiyordum! – dirkgently

+0

Güzel bir kütüphane. Ayrıca birden fazla diskte şeritleme verilerini destekler. –

+0

Teşekkürler. Tam olarak ihtiyacım olana benziyor. – Adam

1

Vahşi bir fikir: Diskteki bir dosyaya/okuyup yazılan/yazan ve STL deque veya queue'a ileten veya gereksinimlerinize uygun olan bir allocator sınıfı uygulayın.

+0

Tipik STL kapsayıcı uygulama ayırıcısının yalnızca bellek ayırma/boşaltma için çalıştırılması dışında, harika bir fikir. Olağan yineleme sırasında, örneğin, ayırıcı hiç yer almaz. Ve konteyner, sayfa yüklerini tetiklemek için "sayfa hataları" oluşturmaz. – AnT

+0

Yükseltme :: süreçler tam olarak bunu yapar. Boost ile kullanıcı alanında iseniz, hepiniz ayarlanır. – hackworks

2

STLXX kitaplığına bakmak isteyebilirsiniz. Peter Sanders tarafından tanımlanan "Sequence Heap" modelini kullanarak disk tabanlı bir öncelik sırası içerir.

0

Bize veriler hakkında bilgi verin. Her madde büyük mü küçük mü? Sabit bir boyut mu yoksa yüksek değişken mi? Disk depolamadaki sorun, öğeler boyut olarak daha çeşitli hale geldikçe, sorun bir veritabanı sorununa benzemeye başlar. Bu durumda, muhtemelen sıranıza destek deposu olarak sqllite veritabanı gibi bir şeye bakmanız gerekir. Ardından ilk kaydı dışarı çıkarmak için SQL kullanabilirsiniz.

Veriler gerçekten büyükse, her bir nesneyi dosya sistemi üzerinde art arda artan dosya adı kullanarak saklayabilirsiniz. Ardından sıra belleği bellekte saklamanız gerekmez. Dosya tarihi, FIFO siparişiniz olur. İlk maddeyi "yığın" dan çıkarmak için dizindeki en eski dosyayı al. Son olarak, veriler küçük ve çok sayıdaysa, std :: list dosyasının veya std :: deque dosyasının Allocator öğesini geçersiz kılmayı düşünebilirsiniz. Allocator sınıfındaki IO dosyasını gizlemek mümkün olabilir. Küçük ve sayısız veri örneği için basit bir çözümüm yok.

0

bu kolları bir bellek içi yığınını alarak

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; 
       }