TurboPFor: Fastest Integer Compression
- TurboPFor: The synonym for "integer compression"
- ALL functions available for AMD/Intel, 64 bits ARMv8 NEON Linux+MacOS/M1 & Power9 Altivec
- 100% C (C++ headers), as simple as memcpy. OS:Linux amd64, arm64, Power9, MacOs (Amd/intel + Apple M1),
- :new:(2023.04) Rust Bindings. Access TurboPFor incl. SSE/AVX2/Neon! from Rust
- :+1: Java Critical Natives/JNI. Access TurboPFor incl. SSE/AVX2/Neon! from Java as fast as calling from C
- :sparkles: FULL range 8/16/32/64 bits scalar + 16/32/64 bits SIMD functions
- No other "Integer Compression" compress/decompress faster
- :sparkles: Direct Access, integrated (SIMD/AVX2) FOR/delta/Delta of Delta/Zigzag for sorted/unsorted arrays
- For/PFor/PForDelta
- Novel TurboPFor (PFor/PForDelta) scheme w./ direct access + SIMD/AVX2. +RLE
- Outstanding compression/speed. More efficient than ANY other fast "integer compression" scheme.
- Bit Packing
- Fastest and most efficient "SIMD Bit Packing" >20 Billions integers/sec (80Gb/s!)
- Extremely fast scalar "Bit Packing"
- Direct/Random Access : Access any single bit packed entry with zero decompression
- Variable byte
- Scalar "Variable Byte" faster and more efficient than ANY other implementation
- SIMD TurboByte fastest group varint (16+32 bits) incl. integrated delta,zigzag,xor,...
- :new:(2023.03)TurboBitByte novel hybrid scheme combining the fastest SIMD codecs TurboByte+TurboPack. Compress considerably better and can be 3 times faster than streamvbyte
- Simple family
- Novel "Variable Simple" (incl. RLE) faster and more efficient than simple16, simple-8b
- Elias fano
- Fastest "Elias Fano" implementation w/ or w/o SIMD/AVX2
- :new:(2023.03)TurboVLC novel variable length encoding for large integers with exponent + variable bit mantissa
- :new:(2023.03)Binary interpolative coding : fastest implementation
- Transform
- Scalar & SIMD Transform: Delta, Zigzag, Zigzag of delta, XOR,
- :new:(2023.03) Transpose/Shuffle with integrated Xor and zigzag delta
- :new:(2023.03) 2D/3D/4D transpose
- lossy floating point compression with TurboPFor or TurboTranspose+lz77/bwt
- :new:(2023.03)IC Codecs transpose/rle + general purpose compression with lz4,zstd,turborc (range coder),bwt...
- Floating Point Compression
- Delta/Zigzag + improved gorilla style + (Differential) Finite Context Method FCM/DFCM floating point compression
- Using TurboPFor, unsurpassed compression and more than 8 GB/s throughput
- Point wise relative error bound lossy floating point compression
- TurboFloat novel efficient floating point compression using TurboPFor
- :new:(2023.03)TurboFloat LzXor novel floating point lempel-ziv compression
- :new:(2023.06) _Float16 16 bits floating point support
- :new:(2023.06) float 16/32/64 bits quantization with variable quantization bit size.
- Time Series Compression
- Fastest Gorilla 16/32/64 bits style compression (zigzag of delta + RLE).
- can compress timestamps to only 0.01%. Speed > 10 GB/s compression and > 13 GB/s decompress.
- Inverted Index ...do less, go fast!
- Direct Access to compressed frequency and position data w/ zero decompression
- Novel "Intersection w/ skip intervals", decompress the minimum necessary blocks (~10-15%)!.
- Novel Implicit skips with zero extra overhead
- Novel Efficient Bidirectional Inverted Index Architecture (forward/backwards traversal) incl. "integer compression".
- more than 2000! queries per second on GOV2 dataset (25 millions documents) on a SINGLE core
- :sparkles: Revolutionary Parallel Query Processing on Multicores > 7000!!! queries/sec on a simple quad core PC.
...forgetMap Reduce, Hadoop, multi-node clusters,...
Integer Compression Benchmark (single thread):
- Download IcApp a new benchmark for TurboPFor
for testing allmost all integer and floating point file types. ( type: icapp ZIPF ) - Benchmark: TurboTranspose+iccodecs vs Quantile Compression
- Benchmark: TurboByte+TurboBitByte vs streamvbtyte
- Benchmark: Time Series - TurboPFor, TurboFloat, TurboFloat LzX, TurboGorilla,...
- Benchmark: Lossy Floating Point Preprocessing Turbo Razor vs Granular bitround vs libroundfast
- Benchmark: Lossless/Lossy Floating Point Compression. TurboPFor vs zfp & blosc
- Benchmark: TurboPFor: IcApp 16 bits Integer Compression
- Benchmark Intel CPU: Skylake i7-6700 3.4GHz gcc 9.2
- Benchmark ARM: ARMv8 A73-ODROID-N2 1.8GHz
- Synthetic data:
-
Generate and test (zipfian) skewed distribution (100.000.000 integers, Block size=128/256)
Note: Unlike general purpose compression, a small fixed size (ex. 128 integers) is in general used in "integer compression". Large blocks involved, while processing queries (inverted index, search engines, databases, graphs, in memory computing,...) need to be entirely decoded../icapp -a1.5 -m0 -M255 -n100M ZIPF
C Size | ratio% | Bits/Integer | C MB/s | D MB/s | Name 2019.11 |
---|---|---|---|---|---|
62,939,886 | 15.7 | 5.04 | 2369 | 10950 | TurboPFor256 |
63,392,759 | 15.8 | 5.07 | 1359 | 7803 | TurboPFor128 |
63,392,801 | 15.8 | 5.07 | 1328 | 924 | TurboPForDA |
65,060,504 | 16.3 | 5.20 | 60 | 2748 | FP_SIMDOptPFor |
65,359,916 | 16.3 | 5.23 | 32 | 2436 | PC_OptPFD |
73,477,088 | 18.4 | 5.88 | 408 | 2484 | PC_Simple16 |
73,481,096 | 18.4 | 5.88 | 624 | 8748 | FP_SimdFastPFor 64Ki * |
76,345,136 | 19.1 | 6.11 | 1072 | 2878 | VSimple |
91,947,533 | 23.0 | 7.36 | 284 | 11737 | QMX 64k * |
93,285,864 | 23.3 | 7.46 | 1568 | 10232 | FP_GroupSimple 64Ki * |
95,915,096 | 24.0 | 7.67 | 848 | 3832 | Simple-8b |
99,910,930 | 25.0 | 7.99 | 17298 | 12408 | TurboByte+TurboPack |
99,910,930 | 25.0 | 7.99 | 17357 | 12363 | TurboPackV sse |
99,910,930 | 25.0 | 7.99 | 11694 | 10138 | TurboPack scalar |
99,910,930 | 25.0 | 7.99 | 8420 | 8876 | TurboFor |
100,332,929 | 25.1 | 8.03 | 17077 | 11170 | TurboPack256V avx2 |
101,015,650 | 25.3 | 8.08 | 11191 | 10333 | TurboVByte |
102,074,663 | 25.5 | 8.17 | 6689 | 9524 | MaskedVByte |
102,074,663 | 25.5 | 8.17 | 2260 | 4208 | PC_Vbyte |
102,083,036 | 25.5 | 8.17 | 5200 | 4268 | FP_VByte |
112,500,000 | 28.1 | 9.00 | 1528 | 12140 | VarintG8IU |
125,000,000 | 31.2 | 10.00 | 13039 | 12366 | TurboByte |
125,000,000 | 31.2 | 10.00 | 11197 | 11984 | StreamVbyte 2019 |
400,000,000 | 100.00 | 32.00 | 8960 | 8948 | Copy |
N/A | N/A | EliasFano |
(*) codecs inefficient for small block sizes are tested with 64Ki integers/block.
- MB/s: 1.000.000 bytes/second. 1000 MB/s = 1 GB/s
- #BOLD = pareto frontier.
- FP=FastPFor SC:simdcomp PC:Polycom
- TurboPForDA,TurboForDA: Direct Access is normally used when accessing few individual values.
- Eliasfano can be directly used only for increasing sequences
- Data files:
- gov2.sorted from DocId data set Block size=128/Delta coding
Size | Ratio % | Bits/Integer | C Time MB/s | D Time MB/s | Function 2019.11 |
---|---|---|---|---|---|
3,321,663,893 | 13.9 | 4.44 | 1320 | 6088 | TurboPFor |
3,339,730,557 | 14.0 | 4.47 | 32 | 2144 | PC.OptPFD |
3,350,717,959 | 14.0 | 4.48 | 1536 | 7128 | TurboPFor256 |
3,501,671,314 | 14.6 | 4.68 | 56 | 2840 | VSimple |
3,768,146,467 | 15.8 | 5.04 | 3228 | 3652 | EliasFanoV |
3,822,161,885 | 16.0 | 5.11 | 572 | 2444 | PC_Simple16 |
4,411,714,936 | 18.4 | 5.90 | 9304 | 10444 | TurboByte+TurboPack |
4,521,326,518 | 18.9 | 6.05 | 836 | 3296 | Simple-8b |
4,649,671,427 | 19.4 | 6.22 | 3084 | 3848 | TurboVbyte |
4,955,740,045 | 20.7 | 6.63 | 7064 | 10268 | TurboPackV |
4,955,740,045 | 20.7 | 6.63 | 5724 | 8020 | TurboPack |
5,205,324,760 | 21.8 | 6.96 | 6952 | 9488 | SC_SIMDPack128 |
5,393,769,503 | 22.5 | 7.21 | 14466 | 11902 | TurboPackV256 |
6,221,886,390 | 26.0 | 8.32 | 6668 | 6952 | TurboFor |
6,221,886,390 | 26.0 | 8.32 | 6644 | 2260 | TurboForDA |
6,699,519,000 | 28.0 | 8.96 | 1888 | 1980 | FP_Vbyte |
6,700,989,563 | 28.0 | 8.96 | 2740 | 3384 | MaskedVByte |
7,622,896,878 | 31.9 | 10.20 | 836 | 4792 | VarintG8IU |
8,060,125,035 | 33.7 | 11.50 | 8456 | 9476 | Streamvbyte 2019 |
8,594,342,216 | 35.9 | 11.50 | 5228 | 6376 | libfor |
23,918,861,764 | 100.0 | 32.00 | 5824 | 5924 | Copy |
Block size: 64Ki = 256k bytes. Ki=1024 Integers
Size | Ratio % | Bits/Integer | C Time MB/s | D Time MB/s | Function |
---|---|---|---|---|---|
3,164,940,562 | 13.2 | 4.23 | 1344 | 6004 | TurboPFor 64Ki |
3,273,213,464 | 13.7 | 4.38 | 1496 | 7008 | TurboPFor256 64Ki |
3,965,982,954 | 16.6 | 5.30 | 1520 | 2452 | lz4+DT 64Ki |
4,234,154,427 | 17.7 | 5.66 | 436 | 5672 | qmx 64Ki |
6,074,995,117 | 25.4 | 8.13 | 1976 | 2916 | blosc_lz4 64Ki |
8,773,150,644 | 36.7 | 11.74 | 2548 | 5204 | blosc_lz 64Ki |
"lz4+DT 64Ki" = Delta+Transpose from TurboPFor + lz4
"blosc_lz4" internal lz4 compressor+vectorized shuffle
- Time Series:
-
Test file Timestamps: ts.txt(sorted)
./icapp -Ft ts.txt -I15 -J15
Function | C MB/s | size | ratio% | D MB/s | Text |
---|---|---|---|---|---|
bvzenc32 | 10632 | 45,909 | 0.008 | 12823 | ZigZag |
bvzzenc32 | 8914 | 56,713 | 0.010 | 13499 | ZigZag Delta of delta |
vsenc32 | 12294 | 140,400 | 0.024 |