문제

메모리 트리 구조를 지속성 목적으로 디렉토리 트리로 저장하는 실용성에 대해 궁금했습니다. 제 경우에는 파일 시스템을 대상으로 할 것이며 구조가 생성되면 여러 프로세스에 의해 드물게 액세스됩니다.

Performant는 데이터 트리의 지속 메커니즘으로 디렉토리 트리를 어떻게 사용하고 있습니까?

도움이 되었습니까?

해결책

트리를 읽고 쓰려면 노드 당 파일 시스템을 여러 번 호출하게됩니다. 이것은 메모리 이미지를 걷기 위해 고안 할 수있는 제정신 코드보다 훨씬 비쌉니다.

그것이 합리적인 접근법인지 여부는 사용 패턴이 무엇인지에 따라 다릅니다. 전체 트리 구조에서 읽을 것으로 예상되는 코드의 일반적인 호출에서 작업을 수행 한 다음 전체적으로 작성하십시오. 단일 파일로 마샬링하는 것이 좋습니다. 그러나 몇 가지 노드 만 읽거나 작업 할 것으로 예상되는 경우 없이 대부분의 트리에서 읽기 디렉토리 구조를 걷는 것과 다중 작업을 수행하는 것의 성능 차이는 단일 파일에 저장된 트리를 가로 지르기 위해 / 읽기 / 읽기의 성능 차이가 훨씬 작아지며 단순성 / 명확성을 위해 전자를 할 가치가있을 수 있습니다. 재창조 휠을 피합니다. 또한, 여러 프로세스가 동시에이 작업을 수행하는 경우 디렉토리 기반 접근 방식으로 노드와 하위 트리 잠금이 훨씬 쉬워집니다.

일반적으로 사용되는 일부 파일 시스템의 경우 디렉토리 항목을 여는 시간은 디렉토리의 총 항목 수에 따라 다릅니다.

편집 : 사이트의 CGI 백엔드에 대해 ext3에서 비슷한 일을했습니다. 휠을 재창조하지 않으면 프로토 타이핑이 더 빠르고 유지 보수가 더 간단하게 만들어졌고, 읽기/쓰기/잠금 스케일링, 꽤 잘 유지되었습니다. 하지만 디렉토리 구조 자체에 대한 매우 빈번한 변화는 실제 저장에서 제대로 작동하지 않았습니다. 결국 나는 디렉토리 항목이 매우 자주 추가/제거되는 디렉토리 트리의 섹션이 TMPFS 볼륨에 빠지도록 물건을 재구성했습니다. 재부팅 후. 나는 ZFS에 대한 경험이 거의없고 의도 된 사용 패턴을 모른다. 그래서 이것이 당신에게 문제가 될지 모른다. 나는 지금 매우 많이 사용 된 사이트를 위해 이것을하고 있었을 것입니다. 아마도 내 자신의 이름의 잠금 라이브러리를 대신 굴릴 것입니다.

다른 팁

대부분의 파일 시스템은 열린 파일에 대한 액세스에 최적화되어 있으므로 파일을 열고 닫는 데 상당한 시간이 걸립니다. 나무의 각 잎이 작 으면 전체 구조를 읽고 쓰는 데 필요한 것보다 여러 배가 더 오래 걸립니다.

또한 대부분의 파일 시스템에는 일반적으로 약 2-8KB의 할당 블록이 최소화됩니다. 잎이 그보다 훨씬 작다면 많은 공간을 낭비하게됩니다.

요컨대, 잎이 작을수록 아이디어가 더 나빠집니다.

내가 올바르게 이해한다면 파일 시스템의 코드 내 표현을 제공하는 트리 구조를 구축하는 것에 대해 이야기하고 있으므로 트리 구조에서 읽고있는 시작 부분에서 오버 헤드가 발생하지만 후속 조회. 그리고 트리의 횡단은 매번 디스크 스토리지를 치는 것보다 빠릅니다.

가능한 문제 :

  • 디스크 공간을 비효율적으로 사용할 수 있습니다 (많은 파일 시스템에서 디렉토리는 파일이므로 디스크의 전체 블록을 차지합니다 ...)
  • 많은 파일 시스템 액세스를 만들기 때문에 읽기/쓰기가 느립니다.
  • 파일 시스템은 각 항목 이름 및/또는 이름에 사용할 수있는 문자에 대한 제한을 부과 할 수 있습니다.
  • 다른 프로세스가 데이터를 손상 시키거나 상당한 잠금 비용이 필요합니다.
  • Solid-State``디스크 ''를 사용할 때 이것은 다른 방법보다 더 많은 글을 만들고 미디어의 수명을 단축 할 수 있습니다.

결론 : 그만한 가치가 없을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top