这是我previous问题的后续行动。
假设我并行处理我的文件。现在我想将处理结果写入文件。由于结果不适合内存,我不能等到所有文件的处理完成然后写结果。我必须以某种方式并行处理和写作。
例如:假设我有包含数字的文件。文件大小约为500M
。文件数约为200
。每个文件都适合内存,但所有文件都不适合。现在我想将这些文件中找到的所有甚至号码写入另一个文件。
如何在Scala(使用Futures
和Scala parallel collections
)中执行此操作?
答案 0 :(得分:5)
在某些时候你必须同步写作。如果您不想阻止其他线程,则可以使用actor将结果写入文件。这看起来像这样:
class FileWriterActor(path: String) extends Actor {
val file = ... // init FileWriter
// this is how you implement an akka actor
// plain scala actors look a bit different
def receive = {
case x: MyResult => file.write(x.toString)
}
override def postStop() = file.close()
}
// usage
val result = ... // calculation stuff
fileWriter ! result
答案 1 :(得分:1)
对于那些不熟悉akka的人:
import java.io.{File, PrintWriter}
import akka.actor.{Actor,ActorSystem,Props}
object AkkaWriterExample extends App{
val outputPath : String = ???
val system = ActorSystem("WriterSystem")
val writer = system.actorOf(Props(new WriterActor(new File(outputPath))), name="writer")
writer ! "this is a test"
system.shutdown()
system.awaitTermination()
}
class WriterActor(outFile: File) extends Actor {
val writer = new PrintWriter(outFile)
// this is how you implement an akka actor
// plain scala actors look a bit different
def receive = {
case str:String => println(str); writer.write(str);
}
override def postStop() = {
writer.flush();
writer.close();
}
}