【问题标题】:Find pattern in akka stream在 akka 流中查找模式
【发布时间】:2017-04-01 22:40:36
【问题描述】:

在我的 scala 代码中,我有一个 akka 流(Source[ByteString, Long]),我在这个流中搜索一个模式(例如“aabb”),如果存在该位置。

有可能吗?

流包含基因组序列(从 20 到 64Mb)。如果序列包含 32 个核碱基的模式,那么这个序列可能很有趣,我将它保存在第一次出现的位置,否则会浪费。 如果使用输入流,我可以创建一个 32 字节的字节缓冲区并检查字节缓冲区中的序列。使用 akka 流还有另一种模式来完成它

【问题讨论】:

  • 你尝试了什么?
  • 您可以使用Source.zipWithIndex 获取位置,并使用Source.sliding 获取流上的滑动窗口,您可以使用它来匹配模式。
  • @devkat -- 不幸的是,我认为这行不通。看我的回答。

标签: scala stream


【解决方案1】:

这会很棘手,因为字节模式可能跨越流中的两个ByteStrings。

如果您确定所有消息都适合内存,最简单的方法是将流聚合成一个单字节字符串并在其中搜索。

可以不将流聚合成单个字符串,但我不认为它是内置的。Akka HTTP 中的akka.http.scaladsl.unmarshalling.MultipartUnmarshallers 代码展示了如何以流方式执行此操作,但它非常繁琐。 (Akka 通过akka.http.impl.engine.parsing.BodyPartParser 状态机对流进行管道传输。)

问题需要澄清

您的用例是什么?

大多数反应式流都是一次性消费的,那么您打算如何处理索引?

如果您尝试解析 HTTP 实体中的 MIME 边界,则直接使用 Akka 的 MultipartUnmarshallers 代码。

【讨论】:

    猜你喜欢
    • 2018-02-22
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    相关资源
    最近更新 更多