Ich habe einen Git-Treebuilder Ich versuche, mit Blobs zu bevölkern. Also versuche ich eine Art Sharding zu machen, um Blobs nach Dateiname einfacher zu finden. Die Dateien sind nach ihrer ID benannt, also angenommen, ich habe die Dateinamen 11, 15, 21 und schäle sie in Ordnern mit einem Vielfachen von 10, die aufgerundet werden. Dann habe ich zwei Ordner: 20 und 30. (In Wirklichkeit haben wir Millionen von Einträgen).LibGit2 Treebuilder Multilevel-Einfügung
in ihnen:
20 -> 11, 15
30 -> 21
Okay, so der Code etwa wie folgt aussieht:
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);
So legen wir einen Klecks in die Scherbe TreeBuilder, schreiben Sie den Baum, dann legen Sie den Baum in einige anderer Baumeister.
Dies läuft sehr langsam (etwa 10x langsamer) als im Gegensatz zu den Shards. Ich kann nicht wirklich sagen, warum das so viel langsamer wäre, wenn man bedenkt, dass wir über die gleiche Anzahl von Dateien schreiben. Vielleicht macht libgit2 intern etwas, wenn ein Baum in einem Baumbuilder überschrieben wird. Ich frage mich nur, ob irgendjemand etwas darüber weiß, dh warum das so viel langsamer ist und ob es irgendeinen Weg gibt es zu beschleunigen.
Meine Idee jetzt, um dies zu umgehen ist, nur die Shard-Karte zu halten, und wenn ich die eigentliche Festschreibung machen, durchlaufen Sie die Karte und fügen Sie alle an diesem Punkt, aber ich möchte vermeiden tue dies wenn möglich.
Ich denke, dass das Problem tatsächlich auf die Tatsache zurückzuführen ist, dass wir die gleichen Baumbuilder immer wieder schreiben müssen, jedes Mal, wenn wir einen neuen Blob zu diesem Shard hinzufügen. Sie werden jedes Mal größer, wenn wir ihnen einen Blob hinzufügen, und wir schreiben sie jedes Mal neu, was langsamer werden muss, da die Baumentwickler mehr Blobs haben (wir schreiben am Ende immer wieder dieselben Blobs). Die oben beschriebene Problemumgehung könnte meine beste Lösung sein. – jboretsky