TurboPFor: Fastest Integer Compression [![Build Status](https://travis-ci.org/powturbo/TurboPFor.svg?branch=master)](https://travis-ci.org/powturbo/TurboPFor) ====================================== - 100% C (C++ compatible headers), without inline assembly

- Fastest **"Variable Byte"** implementation

- Novel **"Variable Simple"** faster than simple16 and more compact than simple64

- Scalar **"Bit Packing"** with bulk decoding as fast as SIMD FastPFor in realistic and practical (No "pure cache") scenarios - Bit Packing with **Direct/Random Access** without decompressing entire blocks - Access any single bit packed entry with **zero decompression** - Reducing **Cache Pollution**

- Novel **"TurboPFor"** (Patched Frame-of-Reference) scheme with direct access or bulk decoding. Outstanding compression

- Several times faster than other libraries - Usage in C/C++ as easy as memcpy - Most functions optimized for speed and others for high compression ratio - **New:** Include more functions

- Instant access to compressed *frequency* and *position* data in inverted index with zero decompression - **New:** Inverted Index Demo + Benchmarks: Intersection of lists of sorted integers. - more than **1000 queries per second** on gov2 (25 millions documents) on a **SINGLE** core. - Decompress only the minimum necessary blocks. # Benchmark: i7-2600k at 3.4GHz, gcc 4.9, ubuntu 14.10. - Single thread - Realistic and practical benchmark with large integer arrays. - No PURE cache benchmark #### Synthetic data: coming soon! #### data files - clueweb09.sorted from FastPFor (http://lemire.me/data/integercompression2014.html)
./icbench -n10000000000 clueweb09.sorted
SizeRatio in %Bits/IntegerC Time MB/sD Time MB/sFunction
5144384058.162.61357.221286.42TurboPFor
5144384058.162.61358.09309.70TurboPFor DA
5398417928.562.746.47767.35OptP4
5831841129.252.96132.42914.89Simple16
6235485659.893.17235.32925.71SimpleV
73336595211.643.72162.211312.15Simple64
86246428913.684.381274.011980.55TurboPack
86246428913.684.381285.28868.06TurboPack DA
86246539113.684.381402.122075.15SIMD-BitPack FPF
6303089028100.0032.001257.501308.22copy
## Compile: make ## Benchmark ###### Synthetic data: 1. test all functions ./icbench -a1.0 -m0 -x8 -n100000000 - zipfian distribution alpha = 1.0 (Ex. -a1.0=uniform -a1.5=skewed distribution) - number of integers = 100000000 - integer range from 0 to 255 (integer size = 0 to 8 bits) 2. individual function test (ex. copy TurboPack TurboPack Direct access) ./icbench -a1.0 -m0 -x8 -ecopy/turbopack/turbopackda -n100000000 ###### Data files: - Data file Benchmark (file format as in FastPFOR) ./icbench gov2.sorted ###### Benchmarking intersections - Download "gov2.sorted" (or clueweb09) + query file "aol.txt" from "http://lemire.me/data/integercompression2014.html" - Create index file gov2.sorted.i
./idxcr gov2.sorted .
create inverted index file "gov2.sorted.i" in the current directory - Benchmarking intersections
./idxqry gov2.sorted.i aol.txt
run queries in file "aol.txt" over the index of gov2 file 8GB Minimum of RAM required (16GB recommended for benchmarking "clueweb09" files). ## Function usage: In general compression/decompression functions are of the form: char *endptr = compress( unsigned *in, int n, char *out) endptr : set by compress to the next character in "out" after the compressed buffer in : input integer array n : number of elements out : pointer to output buffer char *endptr = decompress( char *in, int n, unsigned *out) endptr : set by decompress to the next character in "in" after the decompressed buffer in : pointer to input buffer n : number of elements out : output integer array header files with documentation : vint.h - variable byte vsimple.h - variable simple vp4dc.h,vp4dd.h - TurboPFor bitpack.h,bitunpack.h - Bit Packing ## Reference: - "SIMD-BitPack FPF" from FastPFor https://github.com/lemire/simdcomp - Sorted integer datasets from http://lemire.me/data/integercompression2014.html - OptP4 and Simple-16 from http://jinruhe.com/ #------------------------------------------------