我检查了java.nio.file.Files.copy
,但它阻止了一个线程,直到完成复制。是否有任何库允许以非阻塞方式复制文件?我需要同时执行许多这些操作,并且不能承受这么多的线程被阻塞。尽管我可以使用非阻塞流自己编写一些东西,但我宁愿使用经过测试的,每次都会保证正确的副本(或者检测是否出现问题)的东西。有没有办法在Scala中以非阻塞方式复制文件?
回答
检查: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)解决方案。
我已经使用Process
类,发出操作系统命令来复制文件。当然,必须检查应用程序在哪个操作系统下运行,并发出适当的命令,但是这允许快速和异步拷贝。
由于马里乌斯在评论中正确地提到了斯卡拉Process
块,所以我运行它包裹在未来。
Java 8 Process
引入了函数isAlive()
。非阻塞替代方法是使用Java 8进程并使用调度程序定期轮询以查看进程是否已完成。但是,我没有必要去这个程度。
这只是错误 –
@MariusSoutier为什么?该进程异步运行 – Eduardo
Process'上提供的方法可以阻止进程退出并获取退出值[...]目前,一个无法轮询流程以查看它是否已完成# –
- 1. 非阻塞读Scala中没有制定
- 2. 有没有办法在VBS中执行非阻塞IO或以某种方式向COM事件发出信号?
- 3. 有没有办法使代码块本身非阻塞
- 4. 在非复合操作中有没有办法阻止施工?
- 5. 有没有办法在java中阻塞套接字和阻塞队列?
- 6. 非阻塞方式
- 7. 有没有办法在Node.Js中进行阻塞调用?
- 8. 有没有办法验证没有线程阻塞?
- 9. 有没有办法转变.scala文件转换为.class文件的方式?
- 10. 如何在Scala中创建非阻塞方法?
- 11. IronPython + Winforms以非阻塞的方式
- 12. PostgreSQL和Scala - 非阻塞API
- 13. 非阻塞scala循环
- 14. 有没有办法在UIKit的cocos2d中复制moveTo方法?
- 15. PHP Inotify非阻塞方式
- 16. 非阻塞方式的Kombu
- 17. 有没有什么办法在Android KitKat中以编程方式阻止SMS?
- 18. 有没有办法显示“阻塞”WinForms的ContextMenu?
- 19. 有没有办法隔离阻塞异步代码的库
- 20. 有没有办法让StringIO读取阻塞
- 21. 有没有办法阻止从textview复制/粘贴?
- 22. Python:为什么recv()在阻塞模式下没有阻塞?
- 23. Scala中的非阻塞和阻塞未来是什么?
- 24. 如何将Scala中的阻塞IO封装为非阻塞
- 25. MPI_Recv没有阻塞
- 26. socket_read()没有阻塞
- 27. 有没有办法在github上强制README.txt文件的格式?
- 28. 打开了QDialog在非阻塞方式
- 29. 在Play中以非阻塞方式使用JDBC的选项有哪些?
- 30. 是否有可能在linux终端中以非阻塞方式实现printf()
您可以使用标准库中的'scala.sys.process'来直接调用'cp'(或任何您的平台上的复制工具)。说实话,我不认为你真的想做并发的副本。无论是SSD还是硬盘,底层硬件都不提供任何并行性,而在硬盘驱动器尝试并行复制的情况下,由于搜索次数增加,导致性能下降。你真的想做什么? – wingedsubmariner
你将这些文件写入哪种存储?如果写入单个硬盘,请考虑一次只运行一个小数字可能会降低性能并降低磁盘的分辨率。 –
@wingedsubmariner:文件托管在Windows文件服务器中(我不知道具体的底层技术) – Eduardo