2016-04-26 9 views
-1

Ich versuche, ein großes Array von 16-Bit-Ganzzahlen (durch die Kamera erworben) zu komprimieren, und ich möchte es so schnell wie möglich komprimieren. Nach dem Betrachten einiger Optionen scheint es jedoch, dass die meisten Bibliotheken für 32-Bit-Daten optimiert sind. (Z https://github.com/lemire/FastPFor)16-Bit-Integer-Array-Komprimierung

Ich habe auch versucht Oroch Bibliothek (https://github.com/ademakov/Oroch), aber es scheint nicht, wie es besonders effizient ist ..

#include <cstdlib> 
#include <chrono> 
#include <iostream> 
#include <vector> 
#include "oroch/varint.h" 
unsigned long length = 1365ul*1531ul*1265ul; 
using namespace std; 
static vector<uint8_t> x; 
static vector<uint16_t> img(length); 
void *read_tiff(string filename,unsigned long length,vector<uint16_t> buffer) 
{ 
    FILE *ptr_file; 
    ptr_file = fopen(filename.c_str(),"rb"); 
    printf("length of array: %lu\n",length); 
    rewind(ptr_file); 
    printf("ok here?"); 
    uint16_t temp; 
    int k; 
    for (k=0;k<length;k++) 
    { 
     //printf("%d",k); 
     fread(&temp,2,1,ptr_file); 
     buffer[k] = temp;  
    } 
    fclose(ptr_file); 
} 
int main(){ 
    cout<<"this is working!\n"; 
    string dir; 
    dir = "somedir"; 
    read_tiff(dir,length,img); 
    cout<<"reading successful"; 
    auto start = chrono::high_resolution_clock::now(); 
    size_t size = oroch::varint_codec<uint16_t>::space(img.begin(),img.end()); 
    x.resize(size); 
    uint8_t *data = x.data(); 
    oroch::varint_codec<uint16_t>::encode(data,img.begin(),img.end()); 
    auto finish = chrono::high_resolution_clock::now(); 
    auto time = chrono::duration_cast<chrono::milliseconds>(finish - start); 
    cout << "emcode time : " << time.count() << " ms" << std::endl; 
    return EXIT_SUCCESS; 
} 

Gibt es eine benutzerfreundliche Bibliothek für andere Integer-Typ?

p.s. Geschwindigkeit wichtiger als Effizienz

Antwort