Je vais mettre cela comme une réponse distincte car elle est fondamentalement différente de mon dernier (et ça marche)
Voici un aperçu d'une solution à l'aide d'acteurs, qui est essentiellement ce que Kim Stebel commentaire décrit. Il y a deux classes acteur, un seul FileReader acteur qui lit les lignes dans le fichier sur demande, et plusieurs Travailleurs acteurs. Les travailleurs de tous les envoyer des demandes de lignes pour le lecteur, et les lignes de production en parallèle comme ils sont lus dans le fichier.
Je suis à l'aide d'Akka acteurs ici, mais en utilisant une autre application est fondamentalement la même idée.
case object LineRequest
case object BeginProcessing
class FileReader extends Actor {
//reads a single line from the file or returns None if EOF
def getLine:Option[String] = ...
def receive = {
case LineRequest => self.sender.foreach{_ ! getLine} //sender is an Option[ActorRef]
}
}
class Worker(reader: ActorRef) extends Actor {
def process(line:String) ...
def receive = {
case BeginProcessing => reader ! LineRequest
case Some(line) => {
process(line)
reader ! LineRequest
}
case None => self.stop
}
}
val reader = actorOf[FileReader].start
val workers = Vector.fill(4)(actorOf(new Worker(reader)).start)
workers.foreach{_ ! BeginProcessing}
//wait for the workers to stop...
De cette façon, pas plus de 4 (ou de l'cependant, de nombreux travailleurs que vous avez) non transformés, les lignes sont en mémoire à la fois.