如何在 Spring 中有效地将排序的通量分组到序列化组中?

Posted

技术标签:

【中文标题】如何在 Spring 中有效地将排序的通量分组到序列化组中?【英文标题】:How to efficiently group a sorted flux into serialized groups in Spring? 【发布时间】:2021-11-30 08:21:27 【问题描述】:

假设我有一个输入 Flux 包含许多(数十亿个字符串),如下所示:

苹果 应用 圣经 书

有数十亿个这样的字符串,它们不适合内存,这就是我想使用响应式方法的原因。

流已排序。现在我想要的是通过前 3 个字符创建一系列有序的字符串组:

应用程序:苹果,应用程序 围兜:圣经 嘘:书

这个Flux 以 HTTP 响应结束,这意味着必须在“bib”项目开始之前输出所有“app”项目。

如果不使用Flux,我可以使用ordered 属性并将项目收集到准备好的存储桶中(每个存储桶的字符串数量将适合内存) - 每当前缀更改时,我将刷新存储桶并开始收集新前缀。排序流的最大好处是我知道一旦遇到新前缀,旧前缀就再也不会出现了。

但是使用Flux 我不知道该怎么做。 .groupBy() 将返回 FluxFlux 但我认为这在尝试将其序列化到 HTTP 响应输出流时不起作用。

【问题讨论】:

【参考方案1】:

这几乎是windowUntilChanged() 的教科书用例。

在您的情况下,您要提取的“键”是字符串的前 3 个字母,因此您可以执行flux.windowUntilChanged(str -> str.substring(0,3)) 之类的操作,这将为您提供Flux<Flux<String>>,其中内部通量开始和结束更改字符串中的前 3 个字母。当然,您可能需要添加一些额外的逻辑来处理长度少于 3 个字符的单词,但我会将其作为练习留给读者 :-)

(我知道您在问题中提到过它,但只是为了澄清和让其他人找到这个答案 - 只有如果流中的传入元素已经排序,这将起作用按字母顺序。)

【讨论】:

以上是关于如何在 Spring 中有效地将排序的通量分组到序列化组中?的主要内容,如果未能解决你的问题,请参考以下文章

有效地将函数并行应用于分组的 pandas DataFrame

在 Spring Boot 客户端中接收通量

有效地将许多大型 CSV 文件中的 XYZ 坐标排序到小图块中

有效地分组字谜

分组,计数,然后排序的最有效方法?

项目 Reactor 中的并行通量与通量