我试图找出是否可以使用protobuf-net来存储和检索以下序列化数据结构:
我每天都有大约200,000个大小为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,但我不确定如何随后随机访问特定列表?任何想法或建议?感谢
答案 0 :(得分:1)
这不是protobuf-net的典型的用例,虽然我怀疑可能这样做,但它不会我本能地尝试这样做。如果关键要求是按天拆分,那么使用多个文件将是一个明显的选择。或者,调整您现有的文件格式以包含(每天)日期戳和当天数据的大小 - 然后您可以使用FileStream
的{{1}}属性在整个过程中向前跳过
protobuf-net 有流式传输和跳过API,或者如果您不想涉及核心序列化器,则可以使用原始的“读取器”API,但是:我不确定这是否会帮助你大量。
坦率地说,因为(在你当前的过程中)每个块都是固定大小,你也可以使用二进制搜索(可能使用线性插值作为凝视位置)来寻找合适的时间。