0

我正在使用两个很棒的库BPlusTreeProtobuf-net来从磁盘存储/检索大量项目。我被允许修改任何序列化的项目......到目前为止一切都很完美。在第一次修改时速度下降到 1/3,在第二次修改时下降到 1/4,依此类推,如下图所示:

项目插入到 B+Tree 速度 每条线代表对相同数据的不同运行;重要的一点是,当修改集合中的项目时,在所有测试中速度都会降低。修改的项是一个类的列表;直到第一次降级(即第 22 组 - 大约第 22*200,000 个项目),此列表仅包含一个实例。之后项目一个接一个地更新为具有更多的类的两个对象,直到第 42 组(大约 42*200,000 个项目),当每个项目开始有 3 个实例时,依此类推。

我的物品来自“B”类,其实现如下:

public class B<C, M>
{
    internal B(char tau, M metadata)
    { 
        _lambda = new List<Lambda<C, M>>();
        _lambda.Add(new Lambda<C, M>(tau: tau, atI: metadata));
    }

    [ProtoMember(1)]
    internal int omega { private set; get; }

    [ProtoMember(2)]
    private List<Lambda<C, M>> _lambda { set; get; }

    internal ReadOnlyCollection<Lambda<C, M>> lambda { get { return _lambda.AsReadOnly(); } }

    internal B<C, M> Update(char tau, M metadata)
    {
        B<C, M> newB= new B<C, M>();
        newB._lambda = new List<Lambda<C, M>>(this._lambda);
        newB._lambda.Add(new Lambda<C, M>(tau: tau, atI: metadata));
        return newB;
    }
}

public class Lambda<C, M>
{
    internal Lambda(char tau, M atI)
    {
        this.tau = tau;
        this.atI = atI;
    }

    [ProtoMember(1)]
    internal char tau { private set; get; }

    [ProtoMember(2)]
    internal M atI { private set; get; }
}

我将我的(反)序列化器定义如下:

public B<C, M> ReadFrom(System.IO.Stream stream)
{
    return Serializer.DeserializeWithLengthPrefix<B<C, M>>(stream, PrefixStyle.Fixed32);
}

public void WriteTo(B<C, M> value, System.IO.Stream stream)
{
    Serializer.SerializeWithLengthPrefix<B<C, M>>(stream, value, PrefixStyle.Fixed32);
}

我怎么能说_lambda<...>尺寸是速度下降的原因?请检查以下图表以进行澄清。正如您所注意到的,时刻_lambda<...>大小发生了变化,我开始受到速度惩罚。

在此处输入图像描述

有什么建议吗?

PS:这项工作有数千行,但缩小代码范围似乎是由“ReadFrom”和“WriteTo”函数引发的。因此,我在这里只放这些行。

4

0 回答 0