노드 포인터는 일반적으로 디스크에 주소로 저장됩니다 (예 : long 정수 사용). 일반적으로 구현에서
는 물리적 또는 논리적 중 주소를 사용하도록 선택합니다
- 물리적 주소가 노드가 저장되는 위치 (파일 내에서 또는 이와 유사한 것) 오프셋 실제를 지정합니다.
- 대조적으로 논리 주소에는 포인터를 탐색/통과 할 때마다 실제 주소로 확인되는 메커니즘이 필요합니다.
실제 주소 지정이 더 빠릅니다 (해결 메커니즘이 필요하지 않으므로). 그러나 논리적 주소 지정을 사용하면 포인터를 다시 쓰지 않아도 노드를 재구성 할 수 있습니다. 이러한 방식으로 노드를 재구성 할 수있는 능력은 우수한 클러스터링, 공간 활용 및 낮은 수준의 데이터 배포를 구현하기위한 기초로 사용할 수 있습니다.
일부 구현은 논리적 및 물리적 주소 지정의 조합을 사용하여 각 주소가 세그먼트 (BLOB) 및 해당 세그먼트 내의 물리적 주소를 참조하는 논리 주소로 구성됩니다.
노드 주소는 디스크 기반이므로 메모리 내 포인터로 직접 변환 할 수 없다는 점에 유의해야합니다.
데이터가 메모리로로드 될 때 디스크 기반 포인터를 메모리 포인터로 변환 한 다음 쓰기 작업을 수행 할 때 디스크 기반 포인터로 다시 변환하는 것이 유리한 경우도 있습니다.
이 변환은 포인터 스위 즐링이라고도하며 여러 가지 방법으로 구현 될 수 있습니다. 기본적인 생각은 에 의해 어드레싱 된 데이터가 포인터가 네비 게이팅/트래버스되기 전에 메모리에로드되지 않아야한다는 것입니다.
일반적인 접근 방식은 논리적 인 메모리 주소 지정 체계를 사용하거나 메모리 매핑 된 파일을 사용하는 것입니다. 메모리 매핑 된 파일은 메모리 페이지가 액세스되기 전에 메모리에로드되지 않는 가상 메모리 주소 지정을 사용합니다. 가상 메모리 매핑 파일은 OS에서 제공합니다. 이 접근 방식은 때로는 페이지 주소가 인 메모리로 매핑되지 않은 메모리 페이지의 데이터에 액세스하면 페이지 오류이 (가) 인터럽트되기 때문에 폴트 된 주소라고도합니다.
어떤 메모리 내 데이터 구조가 필요합니까? 디스크상의 b-tree는 그것을 사용하는 프로세스보다 오래 남아 있어야합니다.; 인 메모리 트리는 디스크상의 것과 같습니다 (작은 차이를 제외하고는 큰 차이점이 있습니다). – usr
@usr 디스크 데이터 구조가 어떻게 구현되는지 혼란스러워합니다. 노드는 어떻게 자신의 자식 노드를 가리 킵니까?그들은 오프셋에 대한 참조를 보유하고 있습니까? 그들의 열쇠? 일반적으로 단일 트리가 단일 파일로 유지됩니까? – alf