我之前发布了一个关于 Protobuf-Net 的相关但仍然不同的问题,所以这里是:
我想知道是否有人(尤其是 Marc)可以评论以下哪项最有可能更快:
(a) 我目前将序列化的内置数据类型存储在二进制文件中。具体来说,一个 long(8 个字节)和 2 个浮点数(2x 4 个字节)。之后的每 3 个组成一个处于反序列化状态的对象。long 类型表示 DateTimeTicks 用于查找目的。我使用二进制搜索来查找数据请求的开始和结束位置。然后,一种方法将数据下载到一个块中(从开始到结束位置),知道每个块由许多上述三元组(1 个长,1 个浮点数,1 个浮点数)组成的数据包,并且每个三元组总是 16 个字节长。因此,检索到的三元组数始终为 (endLocation - startLocation)/16。然后我遍历检索到的字节数组,反序列化(使用 BitConverter)每个内置类型,然后实例化一个由三元组组成的新对象,并将对象存储在列表中以供进一步处理。
(b) 执行以下操作会更快吗?构建一个单独的文件(或实现一个标头),用作查找目的的索引。然后我不会存储内置类型的单个二进制版本,而是使用 Protbuf-net 序列化上述对象的列表(= int、float、float 的三元组作为对象的源)。每个 List 将包含准确且始终为一天的数据(请记住,long 表示 DateTimeTick)。显然,每个列表的大小都会有所不同,因此我的想法是生成另一个文件或标题以用于索引查找,因为每个数据读取请求只会请求一整天的倍数。当我想检索一天的序列化列表时,我会简单地查找索引,读取字节数组,使用 Protobuf-Net 反序列化并且已经有了我的对象列表。
为了更好地了解数据的大小,每个二进制文件大约 3gb 大,因此包含数百万个序列化对象。每个文件包含大约 1000 天的数据。每个数据请求都可以请求任意天数的数据。
您认为原始处理时间更快的是什么?我想在可能编写大量代码来实现(b)之前获得一些输入,我目前有(a)并且能够在我的机器上每秒处理大约 150 万个对象(处理 = 从数据请求到返回的反序列化列表对象)。
摘要:我在问二进制数据是否可以使用方法(a)或(b)更快地读取 I/O 和反序列化。