2013-10-30 42 views
2

我检查了java.nio.file.Files.copy,但它阻止了一个线程,直到完成复制。是否有任何库允许以非阻塞方式复制文件?我需要同时执行许多这些操作,并且不能承受这么多的线程被阻塞。尽管我可以使用非阻塞流自己编写一些东西,但我宁愿使用经过测试的,每次都会保证正确的副本(或者检测是否出现问题)的东西。有没有办法在Scala中以非阻塞方式复制文件?

+0

您可以使用标准库中的'scala.sys.process'来直接调用'cp'(或任何您的平台上的复制工具)。说实话,我不认为你真的想做并发的副本。无论是SSD还是硬盘,底层硬件都不提供任何并行性,而在硬盘驱动器尝试并行复制的情况下,由于搜索次数增加,导致性能下降。你真的想做什么? – wingedsubmariner

+0

你将这些文件写入哪种存储?如果写入单个硬盘,请考虑一次只运行一个小数字可能会降低性能并降低磁盘的分辨率。 –

+0

@wingedsubmariner:文件托管在Windows文件服务器中(我不知道具体的底层技术) – Eduardo

回答

0

检查:Iterate over lines in a file in parallel (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加深对你的表现特点,系统的负荷程度,等等。

还有一个link解释可能的方式做并行使用Akka Actors从(属性)文件read/write数据。这不完全是你可能想要的,但它可能会提供一个想法。

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

-

以及您的发言"While I could write something myself using non-blocking streams"

我想提醒每个OS /文件系统(FS),可有什么和在哪里阻止其自己的视野。如果一个线程写入文件,就像Windows一样阻塞文件(在leat写入块)。在Linux上是可配置的。所以如果你想坚持一些稳定的东西,我会建议想出来,并根据事件,块,状态,用你自己的封装(通过FS)解决方案。

0

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

由于马里乌斯在评论中正确地提到了斯卡拉Process块,所以我运行它包裹在未来。

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

+0

这只是错误 –

+0

@MariusSoutier为什么?该进程异步运行 – Eduardo

+0

Process'上提供的方法可以阻止进程退出并获取退出值[...]目前,一个无法轮询流程以查看它是否已完成# –

相关问题