我需要处理相当大的文件(500Meg + zip文件)。
Scala的演员是否有任何非阻塞的IO开源实现?
答案 0 :(得分:6)
如果我的问题正确,则需要非阻塞IO文件。那时我有个坏消息。
Java6中的Java NIO仅支持在处理文件时的阻止操作。您可能会注意到事实FileChannel
没有实现SelectableChannel
接口。 (NIO确实支持套接字的非阻塞模式)
NIO.2(JSR-203)规范旨在克服java.io和NIO的许多当前限制,并为文件上的异步IO提供支持。据我所知,NIO.2将与Java 7一起发布。
这些是Java库限制,因此您在Scala中也会遇到它们。
演员基于Doug Lea的Fork-Join框架(至少在分支2.7.x中直到version 2.7.7)。来自FJTask class的一句话:
实际上没有任何阻止 你在FJTask中阻止,和 很短的等待/块是完全的 表现得很好。但FJTasks不是 旨在支持任意 同步,因为没有办法 暂停和恢复个别任务 一旦他们开始执行。 FJTasks也应该是有限的 持续时间 - 它们不应包含 无限循环。 FJTasks可能 需要执行阻止操作,或 长时间持有锁,或 永远循环可以改为创建正常 java将执行此操作的线程对象。 FJTasks只是不适合 支持这些事情。
在Scala中增强了FJ库,以提供一种统一的方式,允许actor像线程一样运行,或者像基于事件的任务一样,具体取决于工作线程的数量和“库活动”(您可以在技术报告中找到解释“{ {3}}“来自Philipp Haller和Martin Odersky。”
但毕竟如果你在一个actor中运行阻塞代码,它的行为就像它是一个线程一样,那么为什么不使用普通的Thread
阻塞读取并从这个线程向基于事件的actor发送事件?
答案 1 :(得分:1)
你在谈论远程演员吗?标准Actor
当然是JVM内部实体。我不知道我害怕NIO实现远程演员。
答案 2 :(得分:1)
你好,这是一个选择吗? bigdata(R)是一个横向扩展存储和计算结构,支持可选事务,非常高的并发性和非常高的聚合IO速率。
答案 3 :(得分:1)
不是我所知道的,但你可能会看到Naggati,一个围绕Apache Mina的Scala包装器,可能会获得很多好处。 Mina是一个使用NIO的网络库,Naggati将其转换为Scala编码风格。