チェックjava.nio.file.Files.copy
しましたが、コピーが完了するまでスレッドがブロックされます。ファイルをブロックしない方法でコピーできるライブラリはありますか? これらの操作の多くを同時に実行する必要があり、非常に多くのスレッドをブロックする余裕はありません。
ノンブロッキング ストリームを使用して自分で何かを作成することもできますが、毎回正しいコピーを保証する (または何か問題が発生したかどうかを検出する) 試行済みのテスト済みのものを使用したいと考えています。
これを確認してください:ファイル内の行を並行して繰り返しますか(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
パフォーマンス特性、システム負荷のレベルなどに合わせて深化をカスタマイズできます.
を使用して(プロパティ)ファイルからデータを並行して処理する方法を説明するもう1つのリンク。これはあなたが望むかもしれないことではありませんが、アイデアを与えるかもしれません.read / write
Akka Actors
アイデア - ファイルを読み取り/コピーする独自のブロックしない方法を構築できます。
--
そしてあなたの声明について"While I could write something myself using non-blocking streams"
:
各 OS / ファイル システム (FS) には、何をどこでブロックするかについて独自のビジョンがあることを思い出してください。1つのスレッドがファイルに書き込むと、Windowsがファイルをブロックするように(少なくとも書き込みブロック)。Linux では構成可能です。したがって、安定したものに固執したい場合は、それを考えて、イベント、チャンク、状態に基づいて独自のラッパー (FS 経由) ソリューションを使用することをお勧めします。
Process
このクラスを使用して、オペレーティング システム コマンドを発行してファイルをコピーしました。もちろん、アプリケーションが実行されている OS を確認し、適切なコマンドを発行する必要がありますが、これにより、高速で非同期のコピーが可能になります。
マリウスがコメントで正しく言及しているように、Scala はProcess
ブロックするので、Future でラップして実行します。
Java 8Process
では関数が導入されましたisAlive()
。非ブロッキングの代替手段は、Java 8 プロセスを使用し、スケジューラーを使用して定期的にポーリングし、プロセスが終了したかどうかを確認することです。しかし、ここまで行く必要はありませんでした。
scala-io の async について調べましたか? http://jesseeichar.github.io/scala-io-doc/0.4.2/index.html#!/core/async%20read%20write