首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行处理多个文件

并行处理多个文件
EN

Stack Overflow用户
提问于 2013-11-21 17:29:54
回答 1查看 515关注 0票数 1

我试图使用scalaz-stream同时处理多个文件,对所有文件中的每一行应用一个函数。具体而言,假设我有一个函数,该函数接受字符串列表。

代码语言:javascript
复制
def f(lines: Seq[String]): Something = ???

还有几个文件,第一个:

代码语言:javascript
复制
foo1
foo2
foo3

第二部分:

代码语言:javascript
复制
bar1
bar2
bar3

整个过程的结果应该是:

代码语言:javascript
复制
List(
  f(Seq("foo1", "bar1")), 
  f(Seq("foo2", "bar2")), 
  f(Seq("foo3", "bar3"))
)

(或者更有可能直接写入其他文件)

文件的数量事先是未知的,不同文件之间的行数可能不同,但我可以(在运行时)填充(在运行时)带有默认值的较短文件的末尾,或者删除较长的文件。

因此,本质上,我需要一种将Seq[Process[Task, String]] (通过类似io.linesR获得的)组合成单个Process[Task, Seq[String]]的方法。

实现这一目标的最简单方法是什么?

或者,更广泛地说,我如何将Process[F, I]Process[F, I]实例组合成一个实例Process[F, Seq[I]]

我肯定有一些标准的组合器,但我想不出.

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-11-22 03:29:57

这个组合器还不存在,但是您可以添加它。我想会是这样的:

代码语言:javascript
复制
def zipN[F[_], A](xs: Seq[Process[F,A]]): Process[F,Seq[A]] = 
  if (xs.isEmpty) Process.halt
  else xs.map(_ map (Vector(_))).reduceLeft(_.zipWith(_)(_ ++ _))

您还可以添加zipAllN,它使用一个值来填充序列(它使用zipAll,以及alignN,后者允许流在耗尽时“退出”输出进程。(因此输出序列可能会变短。)

我建议您将其实现为“平衡的”减少,而不是左或右的减少,因为这样会更有效。

请提交一个拉请求+测试,如果你最终真正实现了这一点!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20127912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档