2

영구 데이터 구조는 효율성을 높이기 위해 구조 공유에 의존합니다. 예를 보려면 here을 참조하십시오.영구/기능적 데이터 구조 직렬화

데이터 구조를 직렬화하고 파일 또는 데이터베이스에 쓸 때 구조 공유를 유지하는 방법은 무엇입니까? 만약 내가 순진하게 데이터 구조를 가로 지르면 올바른 값을 저장 하겠지만 구조 공유는 잃어 버릴 것이다. 나는 공유 구성 요소가있는 데이터 구조를 파일로 저장하고 복원하며 복원 된 데이터에서 공유되는 대부분의 구조를 유지할 수 있기를 바랍니다.

답변

6

해시 컨싱의 일부 양식이 필요합니다. 이 문제는 잘 연구되었습니다. Andrew Kennedy의 paper on pickler combinators은 공유를 유지하면서 직렬화 및 비 직렬화하는 방법을 자세히 설명합니다.

4

제가 생각할 수있는 두 가지 확실한 방법이 있으며 관련되어 있습니다.

  1. 구조에서, 노드를 직렬화 직렬화하지 마십시오. 그래서, 당신이 준 예제 트리에있는 각각의 노드에 대해 직렬화 된 레코드를 저장하면 모든 노드 참조가 노드의 데이터베이스 키 이름으로 변환됩니다. 이렇게하면 자동으로 공유가되지만 구조를로드하기 위해 참조를 쫓는 다중 조회를 수행해야하는 비용이 듭니다.
  2. 귀하의 예와 같이 소유권별로 노드 색을 지정하십시오. 주어진 노드가 속한 구조에 대한 개념을 가지며 그 구조에 속한 구조의 노드 만 직렬화합니다. 다른 구조의 노드에 대한 링크는 해당 구조 및 해당 노드에 대한 참조로 대체됩니다. 이렇게하면 전체 구조체를 한 번에로드 할 수는 있지만 상호 연관성이 높은 경우 모든 관련 구조체를로드해야 할 수 있습니다.

이러한 옵션 중에서 선택하는 것은 최적화하려는 대상과 실제로 볼 수있는 링크의 종류에 따라 다릅니다.