나는 블롭으로 채우려 고 노력하는 git treebuilder가 있습니다. 그래서 파일 이름으로 blob을 쉽게 찾을 수 있도록 sharding을하려고합니다. 파일 이름은 ID로 이름 지어 졌으므로 파일 이름이 11, 15, 21이고 10을 반올림 한 폴더로 분할한다고 가정합니다. 그러면 폴더가 두 개 있습니다 : 20와 30입니다. 실제로는 수백만 개의 항목이 있습니다. 그 안에서LibGit2 treebuilder 다중 레벨 삽입
:
코드 이런 식으로 뭔가 보이는 있도록20 -> 11, 15
30 -> 21
좋아요 :
std::string shardName = roundUp(ID, multiple);
shardTB = shardMap_[shardName];
git_treebuilder_insert(NULL, shardTB, ID, &blobOID, GIT_FILEMODE_BLOB);
git_oid shardOID;
git_treebuilder_write(&shardOID, shardTB);
git_treebuilder_insert(NULL, TopLevelTB, shardName, &shardOID, GIT_FILEMODE_TREE);
그래서 우리는 다음 몇 가지로 그 나무를 삽입, 트리 쓰기, 샤드 treebuilder로 BLOB를 삽입을 다른 treebuilder입니다.
샤드를 사용하지 않고 천천히 (약 10 배 느리게) 실행합니다. 왜 우리가 같은 수의 파일을 쓰고 있다고 생각 하느냐에 따라 이것이 왜 그렇게 느린 지 말할 수 없습니다. 아마 libgit2는 treebuilder 내의 트리를 덮어 쓸 때 내부적으로 뭔가를하고있을 것입니다. 누군가가 그것에 대해 아무것도 모르는 지 궁금해합니다. 즉 속도가 느린 이유와 속도를 높이는 방법이 있다면 말입니다.
내 생각은이 문제를 해결하기 위해 단지 샤드 맵을 유지하는 것입니다. 그러면 실제 커밋을 할 때지도를 반복하고 그 시점에서 모두 추가합니다.하지만 피하고 싶습니다. 가능한 경우이 작업을 수행하십시오.
저는이 문제가 실제로 우리가 동일한 트리 빌더를 반복해서 쓰고 그 조각에 새 BLOB를 추가해야 할 필요가 있다고 생각합니다. 그것들은 blob을 추가 할 때마다 더 커지기 때문에 우리는 treebuilders가 더 많은 blob을 보유 할 때마다 느리게해야하는 모든 시간을 매번 재 작성합니다. 우리는 동일한 blob을 여러 번 다시 작성합니다. 위에 설명 된 내 해결 방법을 수행하는 것이 최선의 방법 일 수 있습니다. – jboretsky