저는 C++로 구현 된 매우 작은 나무 구조 (Burkhard-Keller-Tree, 메모리에서 100MB 이상)로 작업하고 있습니다. 각 노드의 하위에 대한 포인터는 QHash에 저장됩니다.C++에서 트리를 deserialize하는 가장 빠른 방법은 무엇입니까
각 노드 x는 n 개의 자식 y [1] ... y [n]을 가지며, 자식 노드의 가장자리는 편집 거리 d (x, y [i])로 레이블되어 있으므로 해시를 사용하여 노드는 분명한 해결책입니다.
class Node {
int value;
QHash<int, Node*> children;
/* ... */
};
또한이 파일을 직렬화하고 비 직렬화하여 파일로 만듭니다 (현재 QDataStream을 사용하고 있습니다). 나무는 단지 한 번 지어졌고 변경되지 않습니다.
트리를 만들고 deserialize하는 것은 다소 느립니다. 나는 트리를 명백한 방법으로로드하고있다 : 재귀 적으로 각 노드를 구축한다. 나는 이것이 new
연산자로 별도로 생성 된 많은 노드들 때문에 차선책이라고 생각한다. 나는 어딘가에서 new
가 꽤 느리다는 것을 읽었다. 초기 빌드는 트리가 다소 안정적이어서 자주 다시 빌드 할 필요가 없기 때문에 큰 문제는 아닙니다. 그러나 파일에서 트리를로드하는 것은 가능한 한 빨리해야합니다.
이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
인접한 노드가있는 단일 메모리 블록에 전체 트리를 저장하는 것이 훨씬 더 좋습니다. 직렬화와 직렬화를 줄이면 전체 블록을 저장하고로드 할 수 있습니다.이 블록은 한 번만 할당해야합니다.
그러나 이것을 구현하려면 QHash, AFAIK를 다시 구현해야합니다.
역 직렬화의 속도를 높이려면 어떻게해야할까요?
부록 몇 가지 프로파일 링을 할 수 귀하의 제안에 감사드립니다. 다음 결과는 다음과 같습니다
파일에서
1 % of the time is consumed by my own new calls
65 % is consumed by loading the QHash objects (this is implemented by the
Qt Library) of each node
12 % is consumed by inserting the nodes into the existing tree
20 % is everything else
를 트리를 재 구축하는 것은 그래서 definitly 지연의 원인이 있지만, QHash 모든 노드에서 객체의 재 구축 나의 새로운 통화 아니지만. 이것은 기본적으로 다음과 같이 수행됩니다 :
QDataStream in(&infile);
in >> node.hash;
QHash를 파고 거기에서 무슨 일이 일어나는지 살펴야합니까? 최선의 솔루션은 내부 데이터 구조를 다시 작성할 필요없이 단일 읽기 및 쓰기 작업으로 직렬화 할 수있는 해시 객체가 될 것이라고 생각합니다.
특정 노드 y [i]에 빠르게 액세스해야합니까? QHash 대신 QList를 사용해보십시오. I/O에 관해서는 더 빨리 작업해야합니다. – rpg
예. 조회가 빠릅니다. – WolfgangA