1
4
如果只从HugeStream中按顺序读取数据,那么它只需要读取每个子流(并将其附加到本地文件中,并将读取的数据返回给调用方),直到子流耗尽,然后继续下一个子流。如果使用seek操作在数据中“向后”跳转,则必须从本地缓存文件开始读取;当到达缓存文件的结尾时,必须继续读取停止的当前子流。 到目前为止,这些都是直接实现的——您只需要间接地将读调用传递到适当的流,并在每个流耗尽数据时切换流。 这篇引用文章的低效之处在于它贯穿所有的信息流。 每一个 你读到的时间,以确定从何处继续阅读。为了改进这一点,您只需要在需要的时候打开子流,并跟踪当前打开的流,这样您就可以继续从当前流中读取更多的数据,直到用完为止。然后打开下一个流作为您的“当前”流并继续。这是非常直接的,因为你有一个线性的流序列,所以你只需要一个接一个地穿过它们。例如:
为了允许向后查找,您只需要引入一个新的本地文件流,在读取时将所有数据复制到其中(请参见上面我的伪代码中的注释)。您需要引入一个状态,以便知道您正在从缓存文件而不是当前子流读取数据,然后直接访问缓存(查找等很容易,因为缓存代表从HugeStream读取的数据的整个历史记录,所以查找偏移量在HugeStream和缓存之间是相同的-您简化了必须重定向所有读取调用才能将数据从缓存流中取出) 如果读取或查找到缓存流的末尾,则需要继续从当前子流读取数据。回到上面的逻辑,继续向缓存流追加数据。 如果您希望能够支持HugeStream中的完全随机访问,那么您将需要支持查找“转发”(超出缓存流的当前端)。如果您事先不知道子流的长度,那么您就别无选择,只能继续将数据读取到缓存中,直到到达SEEK偏移量为止。如果您知道所有流的大小,那么您可以直接更有效地搜索到正确的位置,但是您必须设计一种有效的方法来存储您读取到缓存文件的数据,并记录缓存文件的哪些部分包含有效数据,哪些部分实际上尚未从数据库中读取-这要多一点。先进的。 我希望这对你有意义,让你更好地了解如何继续…… (您不需要实现更多的read-and-seek接口来实现此功能)。 |
John Smith · Java按值对映射进行分组,其中值为列表 2 年前 |
r3k0j · 在c++中有没有办法将输入字符串转换为输入流? 2 年前 |
Ankur · 猛击猫管据称行为不端 2 年前 |
Ksenia Alexeeva · 什么是产量控制器。流动 2 年前 |
tooFastForSatan · 组合两个流并调用方法 2 年前 |
Logan Lee · 通过在jq中一对一比较两个流进行过滤 2 年前 |
Lev · 使用jOO按属性总结BigDecimal分组 6 年前 |