2

我已经检查过了java.nio.file.Files.copy,但这会阻塞一个线程,直到复制完成。是否有任何库允许以非阻塞方式复制文件?我需要同时执行许多这些操作,并且不能承受这么多线程阻塞。

虽然我可以使用非阻塞流自己编写一些东西,但我宁愿使用经过尝试和测试的东西,以保证每次都正确复制(或检测是否出现问题)。

4

3 回答 3

0

检查这一点:并行迭代文件中的行(Scala)?

val chunkSize = 128 * 1024
val iterator = Source.fromFile(path).getLines.grouped(chunkSize)
iterator.foreach { lines => 
    lines.par.foreach { line => process(line) }
}

并行读取(复制)文件。在这种情况下par,使用“”。

因此,就处理器(内核)的范围/范围而言,它非常无阻塞。

但是您可能会遵循相同的块概念,例如使用Akka/ Future/Promises甚至在更广泛的范围内。

您可以根据chunk-size自己的性能特征、系统负载水平等进行定制。

另一个链接解释了read / write使用Akka Actors. 这并不完全是您可能想要的,但它可能会给出一个想法。

想法 - 您可以构建自己的非阻塞方式来读取/复制文件。

--

关于你的陈述"While I could write something myself using non-blocking streams"

我要提醒的是,每个操作系统/文件系统 (FS) 可能对要阻止的内容和位置有自己的看法。就像 Windows 会在一个线程写入文件时阻止文件(至少是写块)。在 Linux 上是可配置的。因此,如果您想坚持一些稳定的东西,我建议您考虑一下并使用您自己的基于事件、块、状态的包装器(通过 FS)解决方案。

于 2013-10-30T20:29:29.737 回答
0

我已经使用了这个Process类,发出一个操作系统命令来复制文件。当然,必须检查应用程序在哪个操作系统下运行,并发出适当的命令,但这允许快速和异步复制。

正如 Marius 在评论中正确提到的那样,ScalaProcess阻塞了,所以我将它包装在 Future 中运行。

Java 8Process引入了一个函数isAlive()。一个非阻塞的替代方法是使用 Java 8 进程并使用调度程序定期轮询以查看进程是否已完成。不过,我没必要走到这一步。

于 2013-12-01T18:05:49.977 回答
-1

你检查过 scala-io 中的异步内容吗? http://jesseeichar.github.io/scala-io-doc/0.4.2/index.html#!/core/async%20read%20write

于 2013-10-30T16:11:54.940 回答