2013-08-30 10 views
5

Bu program, yüksek oranda yedekli 2 bayt dizileri (görüntü gibi) aktarmak için yuva kullanır. Transfer oranı nispeten yüksek (10 Mbps) iken, diziler de yüksek oranda yedeklidir (örneğin, her sıra birkaç sonuç olarak benzer değerler içerebilir). zlib ve lz4'ü denedim ve sonuçlar ümit vericiydi, ancak yine de daha iyi bir sıkıştırma yöntemi olduğunu düşünüyorum ve lütfen lz4'teki gibi nispeten hızlı olması gerektiğini unutmayın. Baska öneri? satırlardaki veriler böylece azaltan bir kaynak/dizin harita oluşturup benzer iseYüksek oranda yedekli veri için hangi sıkıştırma algoritması kullanılır

+1

"image-compression" etiketli mesaj verdiniz. Verileri bir görüntü akışı sıkıştırıyor mu? Eğer öyleyse ben ya Lossless Video/Image codec kullanın. – Aron

+0

Veriler gerçek görüntüler değil, ancak resim gibi davranmak için gereken tüm gereksinimleri karşılıyorlar ve kayıpsız video kodeklerini inceledim, ancak veriler gerçek zamanlı olarak oluşturuluyor ve video kodekleri sıkıştırma aşamasında yavaş olma eğilimindedir. – beebee

+0

[Bu makale] 'yi (https://www.usenix.org/legacy/event/fast11/tech/full_papers/Meyer.pdf) okumaya çalışın. – jxh

cevap

1

Eğer kendi yaratabilecek önemli boyut, bu

Orijinal dosya gibi bir şey:
satır 1: 1212, 34, 45,1212,45,34,56,45,56
satır 2: 34,45,1212,78,54,87, ....

Kullanımdan farklı bir değer listesi oluşturabilirsiniz. değiştirmede,

34,45,54,56,78,87,1212

satır 1: 6,0,2,6,1,0, .....

bu% 30 veya daha fazla veri transferi üzerinde kurtaracak potantialy, ancak veri

ne kadar gereksiz bağlıdır

İşte GÜNCELLEME

basit uygulama çizgi ile başlar eğer başlamak eğer, "i" siz ", dizini tam tersini alabilirim sadece alıcı son anda

std::set<int> uniqueValues 
DataTable my2dData; //assuming 2d vector implementation 
std::string indexMap; 
std::string fileCompressed = ""; 

int Find(int value){ 
    for(int i = 0; i < uniqueValues.size; ++i){ 
    if(uniqueValues[i] == value) return i; 
    } 
    return -1; 
} 

//create list of unique values 
for(int i = 0; i < my2dData.size; ++i){ 
    for(int j = 0; j < my2dData[i].size; ++j){ 
    uniqueValues.insert(my2dData[i][j]); 
    } 
}  

//create indexes 
for(int i = 0; i < my2dData.size; ++i){ 
    std::string tmpRow = ""; 
    for(int j = 0; j < my2dData[i].size; ++j){ 
    if(tmpRow == ""){ 
     tmpRow = Find(my2dData[i][j]);  
    } 
    else{ 
     tmpRow += "," + Find(my2dData[i][j]); 
    } 
    } 
    tmpRow += "\n\r"; 
    indexMap += tmpRow; 
} 

//create file to transfer 
for(int k = 0; k < uniqueValues.size; ++k){ 
    if(fileCompressed == ""){ 
     fileCompressed = "i: " + uniqueValues[k];  
    } 
    else{ 
     fileCompressed += "," + uniqueValues[k]; 
    } 
} 
fileCompressed += "\n\r\d:" + indexMap; 

d "alırsın Veriler

+0

Teşekkürler Fabrizio. Ben aklımda benzer bir şey var, Ancak, böyle bir yöntemi uygulamaya başlamadan önce, yedek olarak (belirtilen özel model ile) veri için tasarlanmış standart bir sıkıştırma algoritması arıyorum. – beebee

+0

Sanırım @Fabrizio haklı, ama sanırım zlib senin de sorununun kabul edilebilir bir çözümü. Yüksek performans ile yüksek karmaşıklık arasındaki denge noktasını bulmanız gerekir. – Netherwire

+1

bahsettiğiniz kütüphane oldukça iyi bir iş çıkarır, ancak herhangi bir genel amaçlı kütüphane tüm durumlar için en iyi olmayabilecek "genel" olarak uygulandığından, size verdiğim örnek .obj 3d veri dosyaları tarafından kullanılır biçimlendirmek için uzun sürmemelidir ve güçlüdür http://en.wikipedia.org/wiki/Wavefront_.obj_file – Sherlock

4

Sıkıştırmadan önce PNG algorithms for filtering image data'a bakmalısınız. Önceki değerlere dayanan bir 2D dizisinde değerlerin tahmin edilmesi için daha karmaşık yöntemlere başvurmak kolaydır. Tahminlerin iyi olduğu ölçüde, filtreleme sonraki sıkıştırma adımında dramatik gelişmeler sağlayabilir.

Verilerinizde bu filtreleri denemeniz ve daha sonra lz4'e beslemeniz gerekir.

+0

Teşekkürler Mark, konseptini aldım ve komşu piksellerin konseptinin çevredeki 1 piksel komşularından daha fazla uzatılabileceğini düşünüyorum ... Her yöne n piksel penceresine sahip olmayı düşünüyorum. o zaman belki de 3 ... – beebee

+0

filtre tipini kullanın, ancak n-1'in makul zaman içinde n'yi bulduğunu ve 2-kenarları ile ne yapacağını bilmiyorum ... – beebee

+0

Kenarlar için diziyi sanki sıfırlarla çevrili. –

İlgili konular