2014-11-09 3 views
1

나는 형식 아 파크 내 데이터베이스에서 데이터의 엄청난 금액을 가지고가장 좋은 방법

예를 들어
lat;lon;speed;sec:lat;lon;speed;sec...... 

:

53.284534;50.227268;67;0:53.285481;50.226627;68;6:53.286429;50.226042;66;12:....... 

형식은 경도, 속도, 처음부터 두 번째의 수, lattitude입니다 . 각 문자열의 길이는 1000에서 100000입니다. gzcompress() 및 base64_encode()를 통해 데이터베이스에 저장하기 전에 압축하려고합니다. gzcompress 및 base64_encode 다음에 초기 문자열 길이가 7607 인 경우 3444, 이되므로 압축률은 50 %입니다. 문자열을 압축하는 더 효과적인 방법이 있습니까?

답변

1

샘플간에 명확한 상관 관계가 있습니다. 나는 첫 번째 샘플을 제외하고 이전 샘플을 각 샘플에서 뺍니다. 각 차이를 integer of variable length (텍스트가 아닌 2 진수)로 인코딩합니다. 위도와 경도에 대해서는 소수점 이하 6 자리 이상이라는 가정 (검증해야하는)에 1,000,000을 곱합니다. 두 번째 및 세 번째 샘플은 각각 6 바이트 만 필요합니다.

그러면은 gzip으로 압축합니다.

1

그냥 이진수로 저장해보십시오. 이것은 매우 간단하며 매우 빠릅니다. 각 숫자는 4 바이트를 사용하므로 코드에서 직접 사용할 수 있습니다.

더 정확하게 지정하려면 각 구성 요소에 미리 정의 된 값 (각 구성 요소마다 다를 수 있음)을 곱하고 32 비트 정수 단어로 저장하십시오.

+0

더 많은 공간을 절약해야하는 경우 당연히 바이너리 데이터에서 gzcompress()를 시도 할 수 있습니다. 곱해진 정수 값은 부동 소수점과 다르게 압축 될 수 있습니다 (더 잘 압축 될지 예측하기는 다소 어려울 지 모르지만, 정수가 잘 압축 될 것이라고 생각하는 경향이 있습니다. 아마도 많은 바이트 스트림이 중복 될 수 있기 때문입니다). Bzip2와 lzma는 언급 할 가치가있는 두 가지 매우 빠르고 압축 방법입니다 (lzma는 가장 빠름). –

+0

그것에 대해 생각해보십시오. 첫 번째 값 집합을 절대 값으로 저장 한 다음 차이점 만 저장할 수도 있습니다. 이것은 매우 잘 압축됩니다. 정수를 사용하는 경우 변경 사항의 크기에 따라 첫 번째 세트를 32 비트 정수로 저장 한 다음 차이 세트를 16 비트 또는 8 비트 단어로 저장할 수 있습니다. 바이트를 저장하고 바이트 값을 초과하면 단일 업데이트에 대해 두 개의 차이 세트를 저장할 수 있습니다. (어, 이해가 되니?) –

+0

그리고 "차이 세트"는 아마도 매우 잘 압축 될 것입니다. –