9.3. 스토리지 압축
short 배열로 스토리지 압축
Neo4j는 원래의 배열을 압축된 방식으로 저장하려 합니다. 이를 위해 배열의 멤버 저장에 필요한 비트 수를 줄이는 다음의 "bit-shaving" 알고리즘을 사용합니다.:
- 각 배열 멤버각 가장 왼쪽 셋 비트(leftmost set bit)의 위치를 결정합니다.
- 배열의 모든 멤버 중에서 가장 큰 크기(largest such position)를 결정합니다.
- 모든 멤버를 해당 비트 수(가장 큰 크기)로 줄입니다.
- 이러한 값에 작은 헤더를 붙여서 저장합니다.
즉, 배열의 멤버에 음수 값이 포함되어 있으면 "bit-shaving"이 적용되지 못하고, 원래 크기가 사용됩니다.
다음의 경우 결과가 속성 레코드에 인라인 될 수 있습니다:
- 압축 후, 24 바이트보다 작은 경우.
- 배열의 멤버의 개수가 64보다 적은 경우.
예를 들어, 배열 long[] {0L, 1L, 2L, 4L}은 인라인됩니다, 가장 큰 값 (4)는 저장하는데 3 비트만 필요로 하므로, 전체 배열 저장에 4 × 3 = 12 비트만 필요합니다. 그러나 배열 long[] {-1L, 1L, 2L, 4L}은 -1은 64비트가 필요하므로, 배열 전체에는 64 × 4 = 32 바이트가 필요합니다.
short 문자열로 스토리지 압축
Neo4j는 문자열을 short 문자열 클래스로 처리합니다. 속성 공간에 간접 지정(indirection)없이 속성 공간에 인라인으로 저장되 동적 문자열 저장이 값을 저장하는데 관여하지 않아 디스크 풋프린트(footprint)를 줄여 디스크 공간을 줄일 수 있습니다. 또한 속성 저장에 문자열 레코드가 필요하지 않을 경우 단일 룩업에 읽고 쓸수 있으므로 성능이 향상되고 필요한 디스크 공간이 줄어 듭니다. 문자열에는 다음의 클래스들이 있습니다:
- 마침표(.), 스페이스( ), 하이픈(-), 쉼표(,), 윗따옴표(')와 0..9로 이루어진 숫자.
- 스페이스( ), 하이픈(-), 콜론(:), 슬래쉬(/), 더하기(+), 쉼표(,)와 0..9로 이루어진 날짜.
- 숫자 0..9와 소문자 a..f로 이루어진 16진수(소문자)
- 숫자 0..9와 소문자 A..F로 이루어진 16진수(대문자)
- 스페이스( ), 아래 밑줄(_), 마침표(.) , 하이픈(-), 콜론(:), 슬래쉬(/)와 대문자 A..Z로 이루어진 대문자.
- 대문자에서 a..z의 소문자만 바뀌는 소문자.
- 쉼표(,), 아래 밑줄(_), 마침표(.) , 하이픈(-), 더하기(+), at 기호(@)와 소문자 a..z로 이루어진 E-메일,.
- 대부분의 구두 기호와 소문자 a..z, URI, 숫자 0..9로 이루어진 URI.
- 대.소문자 a..zA..z, 숫자 0..9와 마침표(.), 스페이스( )로 이루어진 알파-뉴메릭.
- 대.소문자 a..zA..z, 스페이스( ), 아래 밑줄(_), 마침표(.), 하이픈(-), 콜론(:), 슬래쉬(/), 더하기(+), 쉼표(,), 윗따옴표('), at 기호(@), 파이프(|), 세미콜론(;)으로 이루어진 알파-심볼릭.
- 스페이스( ), 하이픈(-), 아래 밑줄(_), 마침표(.)와 악센트가 있는 글자와 숫자로 이루어진 유러피안 글자(라틴1과 유사하지만 구두 심볼이 적음).
- 라틴 1.
- UTF-8. 문자열의 내용 외에, 문자의 수는 문자열이 인라인 될 수 있는지 여부를 결정합니다. 각 클래스는 다음의 인라인이 될 글자 수 제한를 갖습니다.
표 9.2. 글자 수 제한 | 문자열 클래스 | 글자 수 제한 | |---|---| | 숫자, 날짜, 16진수 | 54 | | 대문자, 소문자, E-메일 | 43 | | URI, 알파-뉴메릭(Alphanumerical), 알파-심볼릭(Alphasymbolical) | 36 | | 유럽 문자(European) | 31 | | 라틴1(Latin1) | 27 | | UTF-8 | 14 |
즉, 가장 큰 인라인 가능 문자열은 길이가 54자이고 숫자 클래스이며 크기가 14 이하인 모든 문자열은 항상 인라인이 됩니다.
또한 위의 제한은 기본 41 바이트 PropertyRecord 레이아웃에 대한 것입니다. 소스 편집 및 재 컴파일을 통해 해당 매개 변수가 변경되면 위를 다시 계산해야합니다.