我使用两个很棒的库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; }
}
我将我的(de)序列化程序定义如下:
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&#39;和&#39; WriteTo&#39;功能。因此,我只在这里放置这些线。