2015-01-30 1 views
2

오랫동안 저장하기 위해 3D R * -tree를 생성해야하지만 성능 또한 문제가됩니다. 트리를 만들려면 Boost의 spacialindex를 사용하기로 결정했으며 두 가지 가능한 방법을 기본적으로 발견했습니다.메모리의 Boost r-tree와 매핑 된 파일의 성능 차이

여기에있는 객체를 사용하여 직접 만듭니다. Index of polygons stored in vector하지만 R * -tree를 다시 만들지 않고 저장하고로드 할 수 없습니다.

여기에 설명 된대로 매핑 된 파일을 사용할 수 있습니다. 그러나이 경우 쿼리 성능이 충분한 지 확신 할 수 없습니다.

내 r 트리는 수천 개의 항목을 포함하지만 대부분은 약 100,000 개 미만입니다. 이제 내 질문은, 거기에 매핑 된 파일을 사용하여 표준 개체를 사용하여 비교하여 어떤 강력한 성능 문제가 있습니까? 또한, 약 100,000 개의 값을 갖는 R * -tree를 생성하는 데 상당한 시간이 필요하지 않은 경우 (모든 경계 상자와 해당 키/데이터가 파일에 저장 될 수 있음) 해당 항목을 건너 뛰는 것이 더 좋은 옵션 일 수 있습니다 매핑 된 파일을 만들고 프로그램을 실행할 때마다 트리를 만듭니 까?

설명서가 실제로 많은 정보를 제공하지 않기 때문에 (누군가가 libspacialindex의 문서보다 더 나은 세상이지만) 도움이되기를 바랍니다.

답변

4

매핑 된 파일은 대부분 일반 메모리처럼 작동합니다. 실제로는 new 또는 malloc을 사용하는 메모리 할당은 mmap [기본 할당 방법으로 "파일 없음"저장 장치를 사용합니다. 그러나 "장소 전체에"작은 글을 많이 쓰고 실제 파일에 매핑하는 경우 OS는 파일에 쓰기 전에 버퍼링 된 쓰기의 양을 제한합니다.

필자가 얼마 전에 필자의 실험을했는데, OS가 이러한 "보류중인 쓰기"를 처리하는 방법에 대한 설정을 조정하여 임의의 읽기/쓰기 패턴을 가진 파일 백 메모리 매핑의 경우에도 합리적으로 성능을 얻었다 [ 당신이 당신의 나무를 짓고있을 때 내가 기대하는 어떤 것이].

여기에 내가 생각하는 질문은 "임의 쓰기와 mmap에의 성능"의 매우 관련이있다 : Bad Linux Memory Mapped File Performance with Random Access C++ & Python (이 답변은 리눅스에 적용 - 그것을 어떻게에 관해서는 완전히 다르게 다른 OS 용의가, 특히 Windows에서 잘 작동 할 수 있습니다

물론 맵핑 된 파일이나 프로그램을 실행할 때마다 "어느 것이 더 낫다"는 말을하는 것은 꽤 어렵습니다. 실제로 실행중인 프로그램의 종류에 달려 있습니다. 1 초에 100 번이나, 하루에 한 번, 나는 [나는 절대적으로 아무 생각이 없다!], 그리고 다른 많은 것들을 재건하는데 얼마나 오래 걸리는지. 두 가지 선택이 있습니다. 가장 간단한 버전을 빌드하고 "충분히 빠르다"는 것을 확인하거나 두 버전을 모두 빌드하고 차이가 얼마나 나는지 측정 한 다음 어느 경로가 다운 될지 결정하십시오.

성능이 좋지 않은 경우 성능이 좋지 않은 경우 속도가 느린 곳을 파악한 다음 수정하여 시간을 절약하고 총 실행 시간은 5 클럭주기가 더 빨라지고 예상보다 500 배 느리게 실행되는 큰 thinko로 끝납니다. ...

+0

빠른 답변 감사드립니다. 당신은 물론 프로그램의 사용에 전적으로 의존한다는 것은 당연한 것입니다. 불행히도, 더 큰 프로젝트에서 일하고 결정적이지는 않지만 내 부분이 정확히 어떻게 사용되는지 그리고 내가 끝내야하기 전에 아마 알지 못할 것입니다. 성능 테스트를 지적 해 주셔서 감사합니다. 아무도 (예 :이 도서관을 만든 Adam Wulkiewicz) 답변을받지 못하면 내가 받아 들일 것입니다. 내 질문에 대한 정확한 대답이 아닐 수도 있지만 일반적으로 주제를 다룹니다. – phil13131

+0

이 답변은 나쁘지는 않지만 OP가 운영 체제를 나타내지 않고 모든 실제 콘텐츠가 Linux에만 적용되므로 너무 구체적입니다. – Puppy

+0

태그에 내 운영 체제를 추가했습니다! 그것을 지적 주셔서 감사합니다. – phil13131

0

대량로드는 인덱스가 많이 반복 삽입보다 빠릅니다. , 그리고 훨씬 더 효율적인 트리를 만듭니다. 따라서 모든 데이터를 메인 메모리에 저장할 수 있다면 STR 벌크로드를 사용하여 트리를 재구성하는 것이 좋습니다. 내 경험상 이것은 충분히 빠르다. (벌크 로딩 시간은 I/O 시간에 비하면 왜소하다.)

STR의 비용은 대략 정렬 비용입니다. 이론적으로 매우 낮은 상수 (O(n log n log n) 일 수는 있지만 아직까지는 상당히 저렴합니다).

+0

답장을 보내 주셔서 감사합니다. 처음에는 패킹 알고리즘을 구현하고 싶었지만 트리를 만드는 방법을 찾을 수 없었습니다. bgi :: rstar, bgi :: linear 및 bgi :: quadratic과 함께 나는 다른 것을 찾지 못했습니다 (bgi = boost :: geometry :: index). 또한 정확하게 저장 장치로 문제를 해결할 수 있습니까? – phil13131

+0

나는 bgi를 사용하지 않았기 때문에 그 기능을 사용할 수 있는지 모르겠습니다. 그러나 전체 R * 트리보다 구현이 더 쉽기 때문에 대량로드가없는 경우 놀랄 것입니다. 일괄 적재는 싸다. 나는 나무를 저장할 필요가 없다고 생각한다. –

+0

고마워, 나는 그걸 들여다보고 내가 찾을 수 있으면 찾아 볼 것이다. 예, 트리가 어쨌든 빠르게 생성 된 경우, 파일을 저장할 필요가 없으며 매번 생성 할 필요가 없습니다. 파일에 키가있는 경계 상자를 추가하기 만하면 데이터를 업데이트하는 것이 더 쉬울 수도 있습니다. – phil13131