gpt4 book ai didi

c# - 为什么我的代码中的 protobuf-net 反序列化器比流式读取 csv 慢得多

转载 作者:行者123 更新时间:2023-11-30 21:09:19 25 4
gpt4 key购买 nike

我以下列格式存储简单的时间序列,并寻找最快的方式来读取和解析它们以“引用”对象:

日期时间、价格 1、价格 2...DateTime 采用以下字符串格式:YYYYmmdd HH:mm:ss:fffprice1和price 2是小数点后5位的数字串(即1.40505)

我试用了不同的方式来存储和读取数据,还试用了 protobuf-net 库。一个已序列化并包含大约 600 万行的文件(按以下方式序列化的原始 csv:

TimeSeries 对象,持有一个 List<Blobs> ,包含 Header 对象和 List<Quotes> 的 Blob 对象(一个 blob 包含一天的引号)包含 DateTime、double px1 和 double px2 的 Quote 对象

(从磁盘)读取序列化二进制文件并反序列化它花了大约 47 秒,这看起来非常长。相比之下,我将时间序列保留为 csv 字符串格式,将每一行读入一个列表,然后将每一行解析为 DateTime dt、double px1、double px1,我将其插入新创建的 Quote 对象并将它们添加到列表中。读取大约需要 10 秒(使用 GZip 压缩需要 12 秒 -> 使文件大小减少 1/9。)

乍一看,我似乎要么错误地处理了 protobuf-net 功能,要么这种特殊类型的时间序列本身不适用于序列化/反序列化。

任何评论或帮助,尤其是 Marc,如果您读到这篇文章,您是否可以插话并添加一些您的想法?我很难想象我最终会得到如此不同的性能数据。

一些信息:我不需要随机访问数据。我只需要阅读一整天,因此将一天的数据存储在一个单独的 csv 文件中对我的目的来说是有意义的,我想。

有什么想法可以最快地读取此类数据吗?我为简单的语言道歉,我不是一个真正的程序员。

这是我用于 protobuf-net 的示例对象:

[ProtoContract]
class TimeSeries
{
[ProtoMember(1)]
public Header Header { get; set; }
[ProtoMember(2)]
public List<DataBlob> DataBlobs { get; set; }
}

[ProtoContract]
class DataBlob
{
[ProtoMember(1)]
public Header Header { get; set; }
[ProtoMember(2)]
public List<Quote> Quotes { get; set; }
}

[ProtoContract]
class Header
{
[ProtoMember(1)]
public string SymbolID { get; set; }
[ProtoMember(2)]
public DateTime StartDateTime { get; set; }
[ProtoMember(3)]
public DateTime EndDateTime { get; set; }
}

[ProtoContract]
class Quote
{
[ProtoMember(1)]
public DateTime DateTime { get; set; }
[ProtoMember(2)]
public double BidPrice { get; set; }
[ProtoMember(3)]
public long AskPrice { get; set; } //Expressed as Spread to BidPrice
}

这是用于序列化/反序列化的代码:

public static void SerializeAll(string fileNameWrite, List<Quote> QuoteList)
{
//Header
Header Header = new Header();
Header.SymbolID = SymbolID;
Header.StartDateTime = StartDateTime;
Header.EndDateTime = EndDateTime;

//Blob
List<DataBlob> DataBlobs = new List<DataBlob>();
DataBlob DataBlob = new DataBlob();
DataBlob.Header = Header;
DataBlob.Quotes = QuoteList;
DataBlobs.Add(DataBlob);

//Create TimeSeries
TimeSeries TimeSeries = new TimeSeries();
TimeSeries.Header = Header;
TimeSeries.DataBlobs = DataBlobs;

using (var file = File.Create(fileNameWrite))
{
Serializer.Serialize(file, TimeSeries);
}
}

public static TimeSeries DeserializeAll(string fileNameBinRead)
{
TimeSeries TimeSeries;

using (var file = File.OpenRead(fileNameBinRead))
{
TimeSeries = Serializer.Deserialize<TimeSeries>(file);
}

return TimeSeries;
}

最佳答案

最快的方法是手动编码的二进制序列化器,尤其是如果你转换 pices ticks。这就是我所做的,尽管我的数量略有不同(每天 6 亿个项目,大约 200.000 个符号,其中一些是头重脚轻的)。我没有以需要从文本解析的方式存储任何内容。解析器是手工制作的,我使用探查器对其进行优化 - aos 可以很好地处理大小(交易有时会降至 1 字节)。

关于c# - 为什么我的代码中的 protobuf-net 反序列化器比流式读取 csv 慢得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9082098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com