C# Protobuf Net和在二进制文件中存储/检索数据块

C# Protobuf Net和在二进制文件中存储/检索数据块,c#,collections,stream,protocol-buffers,protobuf-net,C#,Collections,Stream,Protocol Buffers,Protobuf Net,我正在尝试确定是否可以使用protobuf net存储和检索以下序列化数据结构: 我每天有大约200000个大小为16字节的对象(该对象包含一个长的和两个浮动类型的值,8字节加上2*4字节),我喜欢将它们存储在二进制文件中。这些对象的检索将只在整天内进行,例如,我希望请求2012年4月1日至2012年4月6日之间的对象,这些对象应该从4月1日开始读取,然后从4月2日开始读取,…4月6日。一个要求是访问需要是随机的,这意味着文件可能包含2010年至2012年6月的数据,但我可能只想检索2012年4

我正在尝试确定是否可以使用protobuf net存储和检索以下序列化数据结构:

我每天有大约200000个大小为16字节的对象(该对象包含一个长的和两个浮动类型的值,8字节加上2*4字节),我喜欢将它们存储在二进制文件中。这些对象的检索将只在整天内进行,例如,我希望请求2012年4月1日至2012年4月6日之间的对象,这些对象应该从4月1日开始读取,然后从4月2日开始读取,…4月6日。一个要求是访问需要是随机的,这意味着文件可能包含2010年至2012年6月的数据,但我可能只想检索2012年4月1日至4月6日之间的元素,而不必从一开始就读取所有元素

我目前以DateTimeTick的顺序将数据存储为连续字节数组,但不考虑新的一天何时开始或结束。如果我可以使用protbuf net将数据以IEnumerable的全天“blob”形式流式传输,那将是非常棒的。可能吗?我想用protobuf net为每天存储一个IEnumerable或List,但不确定以后如何随机访问特定的List?有什么想法或建议吗?谢谢,这不是protobuf net的典型使用案例,虽然我怀疑这样使用它是可能的,但我并不本能地这么做。如果关键要求是按天分割,那么使用多个文件将是一个明显的选择。或者,调整现有的文件格式,以包括(每天)日期戳和当天数据的大小,然后您可以使用
FileStream
.Position
属性在整天内向前跳过

protobuf net确实有流式和跳跃式API,如果您不想涉及核心序列化程序,也可以使用原始的“阅读器”API,但是:我不确定这是否会对您有很大帮助

坦白地说,由于(在您当前的过程中)每个块的大小是固定的,所以您也可以使用二进制搜索(可能使用线性插值来确定起始位置)来寻找正确的时间。

这不是protobuf net的典型用例,虽然我怀疑这样使用它是可能的,这样做不是我的本能。如果关键要求是按天分割,那么使用多个文件将是一个明显的选择。或者,调整现有的文件格式,以包括(每天)日期戳和当天数据的大小,然后您可以使用
FileStream
.Position
属性在整天内向前跳过

protobuf net确实有流式和跳跃式API,如果您不想涉及核心序列化程序,也可以使用原始的“阅读器”API,但是:我不确定这是否会对您有很大帮助


坦率地说,由于(在您当前的流程中)每个区块的大小是固定的,因此您也可以使用二进制搜索(可能对起始位置使用线性插值)来寻找正确的时间。

谢谢您的评论。如果我将每天存储在一个单独的文件中,您会建议将对象存储为列表或IEnumerable,并使用protobuf net序列化,还是简单地存储和检索给定日期的所有原始字节数组会更快?@Freddy如果您有一些有效的方法,我会坚持使用它。protobuf net是高效的,但由于格式更加结构化和灵活,还需要进行一定程度的处理。它还希望在输出中添加一些(非常简洁,即每个字段通常为1字节)头。在您描述的情况下,如果数据非常简单(即非结构化、嵌套/内部数据以及可预测的布局),我不确定protobuf net是否会为您带来任何好处。它擅长的是处理更一般的对象序列化,这可能很复杂,并且需要……随着时间的推移进行扩展,以便人们可以轻松地“版本化”数据(即在某个点上添加一个新字段),或者处理复杂的对象树(a有一个B列表,每个B列表都有一个C和一个D,以及所有级别的各种其他字段).谢谢你的评论。如果我将每天存储在一个单独的文件中,您会建议将对象存储为列表或IEnumerable,并使用protobuf net序列化,还是简单地存储和检索给定日期的所有原始字节数组会更快?@Freddy如果您有一些有效的方法,我会坚持使用它。protobuf net是高效的,但由于格式更加结构化和灵活,还需要进行一定程度的处理。它还希望在输出中添加一些(非常简洁,即每个字段通常为1字节)头。在您描述的情况下,如果数据非常简单(即非结构化、嵌套/内部数据以及可预测的布局),我不确定protobuf net是否会为您带来任何好处。它擅长的是处理更一般的对象序列化,这可能很复杂,并且需要……随着时间的推移进行扩展,以便人们可以轻松地“版本化”数据(即在某个点上添加一个新字段),或者处理复杂的对象树(a有一个B列表,每个B列表中有一个C和一个D,以及所有级别的各种其他字段)。