2009-09-09 5 views
4

수십억 (10^9)의 배정 밀도 부동 소수점 숫자를 메모리에 저장하고 공간을 절약하고 싶습니다. 이 값들은 수천 개의 순서가있는 집합 (시간 계열)으로 그룹화되며 집합 내에서 값의 차이가 일반적으로 (절대 값과 비교하여) 크지 않다는 것을 알고 있습니다. 또한, 서로에 가까울수록 그 차이가 상대적으로 작을 확률이 높다.비슷한 수의 복식을 여러 개 압축하는 방법은 무엇입니까?

완벽한 적합성은 이전 값과 각 값의 차이 만 저장하는 델타 인코딩입니다. 그러나 데이터의 하위 집합에 무작위로 액세스하기를 원하기 때문에 전체 집합을 순서대로 처리하지 않아도됩니다. 그러므로 필자는 절대 값 (대부분의 경우)의 10 ~ 50 % 범위에있을 것으로 예상되는 델타를 산출하는 전체 폭 기준선에 델타를 사용합니다.

는 I는 다음의 방법으로 간주했다 : 기억하기위한, 고정 된 정밀도의 정수를 더한 하나의 비트로서 저장 될 수있는 0과 1 사이의 값을 산출

  • 분할 큰 하나 작은 값을 어느 수를 나눈 값입니다. 이것은 매우 간단하고 만족스러운 압축을 산출하지만 무손실 방법이 아니기 때문에 2 차 선택입니다.
  • XOR 두 값의 IEEE 754 binary64로 인코딩 된 표현을 사용하고 지수의 시작 부분에 0의 긴 뻗기의 길이와 다른 가수를 더한 가수를 더한 값을 저장합니다. 여기에서는 압축을 판단하는 방법을 확실히 알지 못하지만 대부분의 경우 압축이 잘되어야한다고 생각합니다.

표준 방법이 있습니까? 위의 접근 방식에 어떤 문제가있을 수 있습니까? 다른 솔루션을 보거나 사용 해본 적이 있습니까?

답변

3

두 지수의 그룹이 같은 지수를 알고있는 경우 지수를 한 번만 저장할 수 있으며 각 값의 가수만 저장할 수 있습니다.

9

의미있는 배정도 숫자의 모든 비트가 거의 없습니다.

측정 결과 값이 수십억이라면 측정 장치의 교정 및 오류를 찾으십시오. 의미있는 비트로 만 작업 할 수 있도록 값을 퀀 타이즈하십시오.

실제로 16 비트의 실제 동적 범위 만 있으면됩니다. 이 모든 것을 원래의 모든 입력을 유지하는 "짧은"배열로 압축 할 수 있습니다.

모든 값이 실제로 표준 편차의 부호 부분 인 간단한 "Z- 점수 기술"을 사용하십시오.

그래서 m 평균 및 의 표준 편차와 샘플의 시퀀스 Z 스코어의 무리로 변환 얻는다. 일반적인 Z- 점수 변환은 double을 사용하지만 그 double의 고정 소수점 버전을 사용해야합니다. s/1000 또는 s/16384 또는 최종 노이즈 비트가 아닌 데이터의 실제 정밀도 만 유지하는 것.

for u in samples: 
    z = int(16384*(u-m)/s) 

for z in scaled_samples: 
    u = s*(z/16384.0)+m 

Z 점수는 원본 샘플과 통계적으로 관련성이있어 작업하기 쉽도록 유지됩니다.


부호가있는 16 비트 Z 점수를 사용한다고 가정 해 보겠습니다. 당신은 +/- 32,768입니다.이것을 16,384로 스케일하고 Z- 스코어는 십진수 0.000061의 효과적인 해상력을가집니다.

서명 된 24- 그러나 Z- 점수를 사용하면 +/- 8 백만입니다. 이 크기를 4,194,304로 조정하면 해상도는 0.00000024가됩니다.

나는이 장치를 정확하게 측정하고 있는지 의심 스럽다. 또한 필터, 캘리브레이션 또는 노이즈 감소의 일부로 수행되는 산술은 산술 중에 도입 된 노이즈 비트로 인해 유효 범위를 감소시킬 수 있습니다. 심하게 배제 된 분할 연산자는 소음보다 더 많은 소수 자릿수를 만들 수 있습니다.

+0

Z- 점수를 가르쳐 주셔서 고맙습니다. 첫 번째 접근 방식으로 시도한 것을 일반화 한 것입니다. 불행하게도 실제, 실제 소스는 정밀도가 매우 다양하며 데이터의 정밀도에 대한 요구는 내 소프트웨어를 사용하는 응용 프로그램에 따라 다르기 때문에 들어오는 데이터의 노이즈에 대해 어떤 가정도 할 수 없습니다. –

4

어떤 압축 스키마를 선택하든 고정 된 크기의 블록으로 압축하고 압축을 해제하는 데 필요한 모든 데이터가 들어있는 헤더를 각 블록 앞에 추가하여 임의의 검색을 수행 할 필요가 있다는 문제를 피할 수 있습니다 (예 : 델타 인코딩 스키마의 경우, 블록은 작은 방식으로 인코딩 된 델타를 포함 할 것입니다. 델타는 지수/가수에 대한 더 적은 비트, 고정 소수점 값으로의 변환, 허프만 인코딩 등 적은 공간을 차지하도록 작은 크기를 이용합니다. 하나의 압축되지 않은 샘플을 헤더로 보낸다.); 그런 다음 찾는 것은 적절한 블록을 저렴하게 선택한 다음 압축 해제하는 것입니다.

압축률이 너무 가변적이어서 많은 양의 공간이 압축 된 데이터를 패딩하여 고정 된 크기의 블록을 낭비하는 경우 압축 된 데이터에 대한 오프셋 디렉토리를 대신 구축 할 수 있으며 압축 해제에 필요한 상태를 기록 할 수 있습니다.

+0

좋은 지적입니다. 고마워요! –

관련 문제