public class GorillaValueCompressor
extends java.lang.Object
이 알고리즘은 이전 값과 현재 값의 차이점을 기반으로 압축을 수행하며, 주로 시계열 데이터의 효율적인 저장 및 전송을 위해 사용된다.
이 클래스는 비트 기반으로 데이터를 처리하므로, 압축된 데이터의 끝 처리가 중요하다, 잘못된 데이터 복원이 발생하지 않도록 주의해야 한다.
이 클래스는 객체 생성이 불가능하며, 모든 메서드는 정적(static)으로 제공된다.
Gorilla Compress의 끝 처리 이슈: 압축된 데이터가 8비트로 정확히 나누어지지 않을 때, 남은 비트들이 0으로 채워진다. 이로 인해, 복원 시 채워진 '0'비트들은 "이전 값과 동일"로 해석되며, 결과적으로 실제 데이터보다 더 많은 값이 복원될 수 있다. 이를 방지하기 위해, 압축된 데이터의 row 개수를 함께 저장하여, 복원 시 정확한 값과 개수만 복원되도록 구현하여 해결하였다. 이는 Time/Timestamp Compress에서도 똑같은 이슈가 나타났고, 같은 방식으로 해결하였음.
| Modifier and Type | Method and Description |
|---|---|
static byte[] |
compressDoubleValue(java.util.List<java.lang.Double> values)
이 메서드는 부동소수점 데이터의 변화를 XOR 연산을 통해 비교하고, 그 결과를 비트로 표현하여 압축한다.
|
public static byte[] compressDoubleValue(java.util.List<java.lang.Double> values)
이 메서드는 부동소수점 데이터의 변화를 XOR 연산을 통해 비교하고, 그 결과를 비트로 표현하여 압축한다. 동일한 값이 연속될 경우 최소 비트만을 사용하여 압축하며, 그렇지 않은 경우에는 변화된 비트만을 저장하여 압축 효율을 극대화한다.
압축 과정에서, 두 값의 XOR 결과를 기반으로 의미 있는 비트를 결정하기 위해 선행 0비트(leading zeros)와 후행 0비트(trailing zeros)의 개수를 계산한다. 이전에 저장된 선행 0비트와 후행 0비트의 정보를 재사용할 수 있는 경우에는 최소한의 비트만 기록하고, 그렇지 않은 경우에는 새로운 선행 및 후행 0비트 정보를 기록하여 데이터를 압축한다. 이를 통해 불필요한 비트 저장을 줄이고, 압축 효율을 높인다.
Gorilla Compress의 끝 처리 문제로 인해, 압축된 데이터가 8비트로 정확히 나누어지지 않을 경우 남은 비트가 0으로 채워질 수 있다. 이로 인해 복원 시 잘못된 값이 추가될 가능성이 있으므로, 이를 방지하기 위해 압축된 데이터의 row 개수를 함께 저장하여 복원 시에는 정확한 값만 복원되도록 구현해야 한다.
values - 압축할 부동소수점(Double) 데이터의 리스트