부동 소수점 데이터 압축


26

부동 소수점 과학 데이터를 압축하기 위해 특별히 설계된 도구가 있습니까?

함수가 부드러 우면 해당 함수를 나타내는 숫자 사이에 많은 상관 관계가 있으므로 데이터를 잘 압축해야합니다. 이진 부동 소수점 데이터를 압축 / 지핑하면 압축되지 않습니다. 부동 소수점 데이터를 압축하기 위해 특별히 개발 된 방법이 있는지 궁금합니다.

요구 사항 :

  • 무손실 압축 또는 보유 할 최소 자릿수 지정 가능 (일부 응용 프로그램의 double경우 float정밀도가 충분하지 않을 수 있지만 필요한 경우보다 많을 수 있음 )

  • 잘 테스트 된 작업 도구 (즉, 이론적 인 방법을 설명하는 논문이 아니라)

  • 시계열과 같은 1D 수치 데이터 압축에 적합

  • 크로스 플랫폼 (Windows에서 작동해야 함)

  • 그것은해야합니다 빠른 바람직 훨씬 느린 GZIP 이상 ---. ASCII로 저장된 숫자가있는 경우 파일을 gzipping하면 파일을 읽고 처리하는 속도가 빨라질 수 있습니다 (작업이 I / O 바인딩 될 수 있음).

실제로 그러한 도구를 실제로 사용한 사람들의 의견을 듣고 싶습니다.


이것은 FLAC 의 존재에서 부분적으로 영감을 얻었으며 , 이는 특수한 방법이 gzip보다 훨씬 낫다는 것을 암시합니다.
Szabolcs

내가 찾고 있어요 지금.
Szabolcs

산뜻한. 나는 이것에 소용돌이를 줄 것이다.
meawoppl

답변:


22

Blosc을 사용해보십시오 . 대부분의 경우 memcopy보다 빠릅니다 . 그것에 대해 잠시 생각하십시오. . . 사악한.

매우 안정적이고 고도로 검증 된 크로스 플랫폼이며 챔피언처럼 작동합니다.


오 와우, 이건 정말 멋지다 (나에게 새로운!)
Aron Ahmadia

링크가 끊어졌습니다. 지금 어디에 있는지 알 수 있습니까?
Alexis Wilke

1
@AlexisWilke 링크를 수정했습니다. Blosc에 대한 Google 검색의 첫 번째 결과였습니다.
Doug Lipinski

1
Blosc은 빠르지 만 플로트 어레이의 압축률은 재앙입니다. 압축률이 가장 높으면 원래 크기의 약 98 %가됩니다. 어쨌든 팁 주셔서 감사합니다.

float 배열의 압축은 내용에 따라 크게 달라집니다. 압축하는 비트에 (구조화 된) 정보가 거의없는 것 같습니다. 또한, blosc는 5 년 후에도 여전히 개발 중입니다!
meawoppl

7

HDF5 와 GZIP 필터를 사용하여 좋은 결과를 얻었습니다 .

HDF5는 또한 일부 과학적 데이터 세트에 대해 더 나은 결과를 달성 하는 SZIP 필터를 제공합니다.

내 경험상 압축의 선택은 데이터의 종류에 따라 크게 달라지며 벤치마킹은 아마도 좋은 선택을하는 유일한 방법 일 것입니다.

BTW, HDF5 용 타사 필터 에는 BLOSC, BZIP2, LZO, LZF, MAFISC가 있습니다.


대답 해줘서 고마워! 나는 HDF5를 많이 사용하지 않았습니다. HDF5 형식의 gzip 필터를 사용하면 모든 숫자를 플랫 이진 파일에 쓰고 gzip을 통해 실행하는 것과 동일한 압축 비율을 얻을 수 있습니까? (지금은 HDF5를 사용할 때의 편의성 / 불편 성을 무시하십시오.) SZIP와 관련하여 어떤 방식으로 부동 소수점 데이터 세트에 최적화되어 있습니까? (호기심이 많으며 링크 한 페이지를 감추는 것이 확실하지 않습니다.) 페이지에 SZIP의 주요 장점은 속도입니다. GZIP도 매우 빠릅니다 (보통 gzip 압축 해제는 무시할 만합니다).
Szabolcs

gzip으로 압축 된 이진 파일은 HDF5가 원시 데이터 이상이므로 gzip 필터가있는 HDF5 파일보다 작을 수 있습니다. 셔플 필터로 전처리를 수행하면 gzip 결과가 향상 될 수 있습니다. 그러나 당신은 옳습니다. 장점은 실제로 더 편리합니다. HDF5를 사용하면 압축 필터를 쉽게 변경하고 (다른 설정을 시도) HDF5는 데이터의 하위 집합 (시계열의 간격)에 액세스하는 기능을 제공합니다.
f3lix

1
이 경로를 사용하면 pyTables를 확인하십시오 . 위의 코드를 몇 줄로 만듭니다. Blosc 저자에 의해 (이전에) 유지되었습니다.
meawoppl

6

회귀 또는 변환 방법 (푸리에 변환, 체비 쇼프 변환) 방법을 시계열 또는 1D 함수 데이터의 "압축"으로 해석 할 수 있습니다. Remez의 알고리즘은 다른 후보가 될 것입니다. 이 경우 FFT를 통해 회귀, FFT 또는 Chebyshev와 같은 것을 사용하면 목적에 맞습니다. 즉, 이러한 방법 중 어느 것도 임의 구조의 시계열 데이터에서 작동하지 않습니다 . 예를 들어, FFT를 사용하면 주기성이 있다고 가정하고 데이터의 모든 불연속성 (또는 주기성이 없음)으로 인해 Gibbs 현상이 발생 합니다. 마찬가지로, 체비 셰프 변환하여 상기 가정은 데이터에 대해 함수를 설명하는 것이다 .[1,1]

기본 기능에 따라, 데이터 포인트보다 기능적 형태를 설명하기 위해 더 적은 계수가 요구되며 (압축으로 이어짐) 오류없이 데이터를 기능적 형태에 맞출 수 있습니다. 이 방법 중 일부에 대해서는 오류 결과가 존재하지만, 그중 어떤 것이 오류에 대한 선험적 (또는 posteriori ) 한계 또는 추정치를 줄지 모르겠습니다 .

FPC 및 관련 알고리즘과 같이 부동 소수점 숫자의 압축을 위해 특별히 개발 된 방법을 살펴볼 수도 있습니다. 서류를 참조하십시오 여기 , 여기 , 여기 , 여기 , 그리고 여기에 기존 소스 코드를 포함하는 웹 페이지와 함께, 여기 .


실제로 저는 gzip과 비슷한 기성품 도구에 관심이 있는데, 특히 자체 방법을 개발하고 조정하지 않아도됩니다. 또한 순차적으로 처리 할 수있는 매우 큰 데이터 파일이있을 수 있으므로 압축을 풀기 전에 메모리로 모든 것을 읽을 필요가없는 방법을 사용하는 것이 유리합니다 (gzip과 함께 작동하지만 Fourier를 사용하는 경우는 아닙니다) 데이터를 덩어리로 나눠서 전체를 더 복잡하게 만들지 않는 한 변환하십시오. 내 데이터 파일이 일련의 이진 배가라고 가정하는 것이 우수합니다.
Szabolcs

또한 이것은 실제로 압축 기술이 아닌 1 : 1 변환입니다. 순진한 압축 알고리즘으로 더 잘 수행 할 수있는 데이터를 작성하는 데 사용될 수 있지만 독립형은 솔루션이 아닙니다.
meawoppl

이러한 방법 중 일부는 신호 처리에 사용되는 압축 알고리즘의 수학적 기초를 형성하며, 이것이 답의 배경이었습니다. 이러한 변환은 일반적으로 특별한 상황을 제외하고는 1 : 1이 아닙니다.
Geoff Oxberry

3

HDF5는 N 부동 소수점 숫자의 바이트가 재정렬되어 N 숫자의 첫 번째 바이트가 먼저오고 그 다음에 두 번째 등이되는 "셔플 링"알고리즘을 사용할 수 있습니다. 이것은 gzip을 적용한 후에 동일한 값의 더 긴 시퀀스를 생성 할 가능성이 높기 때문에 더 나은 압축 비율을 생성합니다. 벤치 마크에 대해서는 여기를 참조 하십시오 .


1

SZ (2016 년 Argonne에서 개발)는 좋은 선택이 될 수 있습니다.

SZ : 과학 응용 프로그램을위한 빠른 오류 경계 부동 소수점 데이터 압축기 https://collab.cels.anl.gov/display/ESR/SZ


왜 이것이 좋은 선택이라고 생각하십니까? 다른 압축 기술과 비교하여 그 기능은 무엇입니까?
Paul

1

부동 소수점 압축에 사용할 수있는 가능한 방법 :

  • Float의 경우 4xN, double + lz77의 경우 8xN의 조옮김
    구현 : TurboTranspose의 부동 소수점 압축
    은 오류 제한 손실 압축 참조

  • 예측 자 (예 : 유한 컨텍스트 방법) + 인코딩 (예 : "정수 압축").
    구현 : TurboP의 부동 소수점 압축
    시계열에 대한 특수 압축을 포함합니다.

  • 가능하면 모든 부동 소수점 숫자를 정수 (예 : 1.63-> 163)로 변환 한 다음 정수 압축을 사용하십시오.

  • Linux 및 Windows 용 icapp 도구를 사용하여 데이터로 이러한 모든 방법을 테스트 할 수 있습니다 .


1

우리는 의료 영상 데이터를 위해 ZFP 를 HDF5와 함께 사용 하고 있습니다. 손실, 부동 소수점 압축을 위해 만들어졌습니다.

우리는 문자 그대로 모든 것을 실행하고 있으며 40TB가 넘는 데이터가 저장되어 있고 사용 중입니다! 데이터를 실시간으로 저장할 수있을만큼 빠르며 필요한 정밀도를 지정할 수 있으므로 형식이 손실되는 동안 최종 출력에 차이가 없습니다.


0

함수가 부드러 우면 해당 함수를 나타내는 숫자 사이에 많은 상관 관계가 있으므로 데이터를 잘 압축해야합니다.

아마도 필요한 형식은 값에서 이웃 값까지의 오프셋 만 저장해야합니다.

또는 주파수 영역을 사용하여 사운드에 동일한 속성 중 일부가 필요하므로 이러한 값을 "flac lossless"와 같은 무손실 오디오 파일로 저장할 수도 있습니다.

그러나 나는 도움이 될 수있는 질문에 대답하려고 시도하는 다른 접근법을 취할 것입니다. 또한이 데이터를 나타내는 최소 설명 길이는 모든 데이터 포인트를 제공하는 것보다 짧습니다.

https://ko.wikipedia.org/wiki/Minimum_description_length

효과적인 프로그램, 컴퓨터 코드가 좋은 예입니다. 그리고 주로 데이터를 실행하여 코드를 작성하여 작업하는 것이 중요하지 않다면 부동 소수점 값을 함수 또는 형식과 같은 무언가로 압축 할 수 있습니다.

이 작업을 특히 자동으로 수행하고 현실적인 계산량으로 수행하는 것은 어려운 일입니다. 그러나 Wolfram Language는이를 시도하기위한 몇 가지 기능을 제공합니다.

https://reference.wolfram.com/language/ref/FindSequenceFunction.html https://reference.wolfram.com/language/ref/FindGeneratingFunction.html https://reference.wolfram.com/language/ref/FindFormula. html

https://reference.wolfram.com/language/ref/RSolve.html


0

왜 float32 / float16을 저장하지 않습니까? numpy에서는

A.astype( np.float32 )  # 100M: 200 msec imac
A.astype( np.float16 )  # 100M: 700 msec

혼돈 이론에서 버터 플라이 효과 를 시뮬레이션하는 경우에는 효과 가 없지만 "내 부분에 대한 작업이 필요 없다"는 이해하기 쉽고 이식 가능합니다. float64를 통한 압축 2 : 1 / 4 : 1은 이길 수 없습니다. :)

노트:

"np.linalg에서는 배열 유형 float16이 지원되지 않습니다"; 읽은 후 32 또는 64로 확장해야합니다.

부동 소수점 매개 변수가 어떻게 다른지 보려면

import numpy as np
for f in [np.float64, np.float32, np.float16]:
    print np.finfo(f)

float 64 32와 16을 비교하는 사소한 테스트 사례의 플롯은 여기를 참조 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.