我正在使用两个很棒的库BPlusTree和Protobuf-net来从磁盘存储/检索大量项目。我被允许修改任何序列化的项目......到目前为止一切都很完美。在第一次修改时速度下降到 1/3,在第二次修改时下降到 1/4,依此类推,如下图所示:
每条线代表对相同数据的不同运行;重要的一点是,当修改集合中的项目时,在所有测试中速度都会降低。修改的项是一个类的列表;直到第一次降级(即第 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”函数引发的。因此,我在这里只放这些行。