2013-08-30 45 views
5

Chương trình này sử dụng ổ cắm để truyền các mảng byte 2D dự phòng cao (giống như hình ảnh). Mặc dù tốc độ truyền tương đối cao (10 Mb/giây), các mảng cũng rất thừa (ví dụ: Mỗi hàng có thể chứa một số giá trị tương tự như vậy). Tôi đã thử zlib và lz4 và kết quả được hứa hẹn, tuy nhiên tôi vẫn nghĩ về một phương pháp nén tốt hơn và hãy nhớ rằng nó phải tương đối nhanh như trong lz4. Bất kỳ đề xuất?thuật toán nén nào sử dụng cho dữ liệu dư thừa

+1

Bạn đã gắn thẻ "nén hình ảnh". Dữ liệu bạn đang nén luồng hình ảnh? Nếu vậy, tôi sẽ đề nghị bạn sử dụng các codec Video/Hình ảnh Lossless. – Aron

+0

Dữ liệu không phải là hình ảnh thực, tuy nhiên chúng đáp ứng tất cả các yêu cầu để xử lý như hình ảnh và tôi đã xem qua các codec video không mất dữ liệu, tuy nhiên dữ liệu được tạo theo thời gian thực và codec video có xu hướng chậm trong giai đoạn nén. – beebee

+0

Hãy thử cung cấp cho [giấy này] (https://www.usenix.org/legacy/event/fast11/tech/full_papers/Meyer.pdf) đọc. – jxh

Trả lời

1

bạn có thể tạo riêng của bạn, nếu dữ liệu trong hàng cũng tương tự như bạn có thể tạo ra một bản đồ tài nguyên/index do đó làm giảm đáng kể kích thước, một cái gì đó giống như

tập tin gốc này:
hàng 1: 1212, 34, 45,1212,45,34,56,45,56
hàng 2: 34,45,1212,78,54,87, ....

bạn có thể tạo danh sách các giá trị duy nhất, hơn sử dụng và chỉ mục thay thế,

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

hàng 1: 6,0,2,6,1,0, .....

điều này có thể giúp bạn tiết kiệm hơn 30% hoặc nhiều lần chuyển dữ liệu nhưng phụ thuộc vào cách dữ liệu thừa là

CẬP NHẬT

Dưới đây là một thực hiện đơn giản

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; 

bây giờ kết thúc nhận bạn chỉ cần làm ngược lại, nếu dòng bắt đầu với "i" bạn sẽ có được các chỉ số, nếu nó bắt đầu với " d "bạn nhận được dữ liệu

+0

Cảm ơn Fabrizio. Tôi có một cái gì đó tương tự trong tâm trí, Tuy nhiên, trước khi thực hiện phương pháp như vậy, tôi đang tìm kiếm một thuật toán nén tiêu chuẩn được thiết kế cho dự phòng (với mô hình cụ thể như đã đề cập) dữ liệu. – beebee

+0

Tôi nghĩ rằng @Fabrizio là đúng, nhưng tôi đoán zlib cũng là một giải pháp khá chấp nhận được của vấn đề của bạn. Bạn cần phải tìm điểm cân bằng giữa hiệu suất cao và độ phức tạp cao. – Netherwire

+1

thư viện bạn đã đề cập làm một công việc khá tốt ở đó, nhưng vì bất kỳ thư viện đa mục đích nào được triển khai là "chung" có thể không tốt nhất cho mọi tình huống, ví dụ tôi cung cấp cho bạn được sử dụng bởi tệp dữ liệu 3d .jj định dạng và không nên mất nhiều thời gian để triển khai và yên tĩnh mạnh mẽ http://en.wikipedia.org/wiki/Wavefront_.obj_file – Sherlock

4

Bạn nên xem PNG algorithms for filtering image data trước khi nén. Chúng đơn giản đến các phương thức phức tạp hơn để dự đoán các giá trị trong một mảng 2D dựa trên các giá trị trước đó. Trong phạm vi dự đoán là tốt, việc lọc có thể làm cho những cải tiến đáng kể trong bước nén tiếp theo.

Bạn chỉ cần thử các bộ lọc này trên dữ liệu của mình và sau đó cấp dữ liệu đó vào lz4.

+0

Cảm ơn Mark, tôi đã có khái niệm và tôi nghĩ khái niệm về pixel lân cận có thể được mở rộng đến hơn 1 pixel láng giềng xung quanh ... Tôi đang nghĩ đến việc có cửa sổ khoảng cách n pixel theo mọi hướng và sau đó có lẽ sử dụng loại bộ lọc 3 ... – beebee

+0

nhưng tôi vẫn không chắc chắn làm thế nào 1- tìm n trong thời gian hợp lý và 2- phải làm gì với các cạnh ... – beebee

+0

Đối với các cạnh, xử lý nó như thể mảng được bao quanh bởi số không. –