如何在 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()
将返回 Flux
的 Flux
但我认为这在尝试将其序列化到 HTTP 响应输出流时不起作用。
【问题讨论】:
【参考方案1】:这几乎是windowUntilChanged()
的教科书用例。
在您的情况下,您要提取的“键”是字符串的前 3 个字母,因此您可以执行flux.windowUntilChanged(str -> str.substring(0,3))
之类的操作,这将为您提供Flux<Flux<String>>
,其中内部通量开始和结束更改字符串中的前 3 个字母。当然,您可能需要添加一些额外的逻辑来处理长度少于 3 个字符的单词,但我会将其作为练习留给读者 :-)
(我知道您在问题中提到过它,但只是为了澄清和让其他人找到这个答案 - 只有如果流中的传入元素已经排序,这将起作用按字母顺序。)
【讨论】:
以上是关于如何在 Spring 中有效地将排序的通量分组到序列化组中?的主要内容,如果未能解决你的问题,请参考以下文章
有效地将函数并行应用于分组的 pandas DataFrame