Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libgit2treebuilder多级插入_Git_Libgit2 - Fatal编程技术网

libgit2treebuilder多级插入

libgit2treebuilder多级插入,git,libgit2,Git,Libgit2,我有一个git treebuilder,我正试图用blob填充它。因此,我尝试进行某种切分,以使通过文件名查找blob更容易。这些文件是根据它们的ID命名的,所以假设我有11、15、21个文件名,我将它们分成10个整数倍的文件夹。然后我有两个文件夹:20和30。(事实上,我们有数以百万计的参赛作品) 其中: 20 -> 11, 15 30 -> 21 好的,代码如下所示: std::string shardName = roundUp(ID, multiple); shard

我有一个git treebuilder,我正试图用blob填充它。因此,我尝试进行某种切分,以使通过文件名查找blob更容易。这些文件是根据它们的ID命名的,所以假设我有11、15、21个文件名,我将它们分成10个整数倍的文件夹。然后我有两个文件夹:20和30。(事实上,我们有数以百万计的参赛作品)

其中:

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);
因此,我们将一个blob插入到shard树生成器中,编写树,然后将该树插入到其他树生成器中

与不使用碎片相比,它的运行速度非常慢(大约慢10倍)。考虑到我们编写的文件数量相同,我真的说不出为什么这样会慢得多。当覆盖treebuilder中的树时,libgit2可能在内部执行某些操作。只是想知道是否有人知道这件事(为什么要慢得多,是否有办法加快速度)


我现在解决这个问题的想法是只保留碎片映射,然后当我进行实际提交时,迭代映射并在该点添加它们,但如果可能的话,我希望避免这样做。

有几种方法可以让libgit2为您做很多这方面的工作。“传统”方法与git在使用
git add
git commit
时所做的相同,即将数据读入索引文件并在其中执行修改

使用libgit2,您不必将此索引数据结构存储在文件中,但可以在内存中处理它。索引有一个缓存,因此它知道不重写未更改的树

您可以使用创建一个新索引,在中读取我们的旧树,执行修改,然后使用将其写回。这将避免为尚未修改的“目录”重新创建树,并且只会将它们写出一次,这听起来好像您在解决方案中没有这样做

如果你有很多条目,这可能会很慢,因为我们需要阅读每一棵树。如果更新的范围经常受到限制,您可以使用它并根据需要进行修改。此函数仅读取由于您提供的更新列表而将要更改的树。它不像手工操作那么灵活,但它涵盖了最常见的情况

如果没有关于整体架构的更多信息,我不知道为什么它会比不使用切分慢得多,但是在您的评论中


我认为这个问题实际上是因为我们需要一遍又一遍地编写相同的树生成器,每次都要向该碎片添加一个新的blob

听起来你是在执行O(n)更新,而不是一个,这当然可以解释这一点


您还提到有“数以百万计的条目”,这表明您正在尝试将Git用作数据库。关于这一点,我最好的建议是不要这样做,而是投资使用数据库。虽然Git系统看起来有点像一个数据库,包含我们称之为数据库的东西,但它是一个非常糟糕的通用数据库。

有几种方法可以让libgit2为您完成这些工作。“传统”方法与git在使用
git add
git commit
时所做的相同,即将数据读入索引文件并在其中执行修改

使用libgit2,您不必将此索引数据结构存储在文件中,但可以在内存中处理它。索引有一个缓存,因此它知道不重写未更改的树

您可以使用创建一个新索引,在中读取我们的旧树,执行修改,然后使用将其写回。这将避免为尚未修改的“目录”重新创建树,并且只会将它们写出一次,这听起来好像您在解决方案中没有这样做

如果你有很多条目,这可能会很慢,因为我们需要阅读每一棵树。如果更新的范围经常受到限制,您可以使用它并根据需要进行修改。此函数仅读取由于您提供的更新列表而将要更改的树。它不像手工操作那么灵活,但它涵盖了最常见的情况

如果没有关于整体架构的更多信息,我不知道为什么它会比不使用切分慢得多,但是在您的评论中


我认为这个问题实际上是因为我们需要一遍又一遍地编写相同的树生成器,每次都要向该碎片添加一个新的blob

听起来你是在执行O(n)更新,而不是一个,这当然可以解释这一点


您还提到有“数以百万计的条目”,这表明您正在尝试将Git用作数据库。关于这一点,我最好的建议是不要这样做,而是投资使用数据库。虽然Git系统看起来有点像数据库,包含我们称之为数据库的东西,但它是一个非常糟糕的通用数据库。

我认为问题实际上是因为我们需要反复编写相同的treebuilders,每次都向该碎片添加一个新的blob。每次我们向它们添加一个blob时,它们都会变得越来越大,每次我们都会重写它们,而随着树生成器持有更多blob,重写的速度必然会变慢(我们会多次重写相同的blob)。我认为这个问题实际上是因为我们需要一遍又一遍地编写相同的树生成器,每次都要向该碎片添加一个新的blob。每次我们向它们添加一个blob时,它们都会变得越来越大,每次我们都会重写它们,而随着树生成器持有更多blob,重写的速度必然会变慢(我们会多次重写相同的blob)。做我上面描述的变通方法可能是我最好的选择。感谢您的全面回复!我不知道git索引文件,所以我将试着看看我是如何