many_compressors.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. /*
  2. Example program demonstrating use of the Blosc filter from C code.
  3. To compile this program:
  4. $ gcc many_compressors.c -o many_compressors -lblosc -lpthread
  5. or, if you don't have the blosc library installed:
  6. $ gcc -O3 -msse2 many_compressors.c ../blosc/*.c -I../blosc \
  7. -o many_compressors -lpthread \
  8. -DHAVE_ZLIB -lz -DHAVE_LZ4 -llz4 -DHAVE_SNAPPY -lsnappy
  9. Using MSVC on Windows:
  10. $ cl /Ox /Femany_compressors.exe /Iblosc many_compressors.c blosc\*.c
  11. To run:
  12. $ ./many_compressors
  13. Blosc version info: 1.10.0.dev ($Date:: 2016-07-20 #$)
  14. Using 4 threads (previously using 1)
  15. Using blosclz compressor
  16. Compression: 4000000 -> 158788 (25.2x)
  17. Succesful roundtrip!
  18. Using lz4 compressor
  19. Compression: 4000000 -> 235419 (17.0x)
  20. Succesful roundtrip!
  21. Using lz4hc compressor
  22. Compression: 4000000 -> 38314 (104.4x)
  23. Succesful roundtrip!
  24. Using snappy compressor
  25. Compression: 4000000 -> 311617 (12.8x)
  26. Succesful roundtrip!
  27. Using zlib compressor
  28. Compression: 4000000 -> 22103 (181.0x)
  29. Succesful roundtrip!
  30. Using zstd compressor
  31. Compression: 4000000 -> 11813 (338.6x)
  32. Succesful roundtrip!
  33. */
  34. #include <stdio.h>
  35. #include <blosc.h>
  36. #define SIZE 100*100*100
  37. #define SHAPE {100,100,100}
  38. #define CHUNKSHAPE {1,100,100}
  39. int main(){
  40. static float data[SIZE];
  41. static float data_out[SIZE];
  42. static float data_dest[SIZE];
  43. int isize = SIZE*sizeof(float), osize = SIZE*sizeof(float);
  44. int dsize = SIZE*sizeof(float), csize;
  45. int nthreads, pnthreads, i;
  46. char* compressors[] = {"blosclz", "lz4", "lz4hc", "snappy", "zlib", "zstd"};
  47. int ccode, rcode;
  48. for(i=0; i<SIZE; i++){
  49. data[i] = i;
  50. }
  51. /* Register the filter with the library */
  52. printf("Blosc version info: %s (%s)\n",
  53. BLOSC_VERSION_STRING, BLOSC_VERSION_DATE);
  54. /* Initialize the Blosc compressor */
  55. blosc_init();
  56. nthreads = 4;
  57. pnthreads = blosc_set_nthreads(nthreads);
  58. printf("Using %d threads (previously using %d)\n", nthreads, pnthreads);
  59. /* Tell Blosc to use some number of threads */
  60. for (ccode=0; ccode <= 5; ccode++) {
  61. rcode = blosc_set_compressor(compressors[ccode]);
  62. if (rcode < 0) {
  63. printf("Error setting %s compressor. It really exists?",
  64. compressors[ccode]);
  65. return rcode;
  66. }
  67. printf("Using %s compressor\n", compressors[ccode]);
  68. /* Compress with clevel=5 and shuffle active */
  69. csize = blosc_compress(5, 1, sizeof(float), isize, data, data_out, osize);
  70. if (csize < 0) {
  71. printf("Compression error. Error code: %d\n", csize);
  72. return csize;
  73. }
  74. printf("Compression: %d -> %d (%.1fx)\n", isize, csize, (1.*isize) / csize);
  75. /* Decompress */
  76. dsize = blosc_decompress(data_out, data_dest, dsize);
  77. if (dsize < 0) {
  78. printf("Decompression error. Error code: %d\n", dsize);
  79. return dsize;
  80. }
  81. /* After using it, destroy the Blosc environment */
  82. blosc_destroy();
  83. for(i=0;i<SIZE;i++){
  84. if(data[i] != data_dest[i]) {
  85. printf("Decompressed data differs from original!\n");
  86. return -1;
  87. }
  88. }
  89. printf("Succesful roundtrip!\n");
  90. }
  91. return 0;
  92. }