use*_*165 5 io parallel-processing multithreading scala
我注意到以下代码使用多个线程并在读取文件时保持所有CPU核心忙100%.
scala.io.Source.fromFile("huge_file.txt").toList
Run Code Online (Sandbox Code Playgroud)
我假设以下是相同的
scala.io.Source.fromFile("huge_file.txt").foreach
Run Code Online (Sandbox Code Playgroud)
我在我的开发机器(OS X 10.9.2)上将Eclipse代码作为单元测试中断,并显示这些线程:main,ReaderThread,3 Daemon System Thread. htop如果我在24核服务器机器(ubuntu 12)的scala控制台中运行它,则显示所有线程都忙.
问题:
foreach在多个线程中运行?我的调试器似乎告诉我代码仍然在主线程中运行.任何见解将不胜感激.
按照建议,我把我的发现放在这里。
我使用以下内容来测试我的虚拟代码(带选项和不带-J-XX:+UseSerialGC选项)
$ scala -J-XX:+UseSerialGC
scala> var c = 0
scala> scala.io.Source.fromFile("huge_file.txt").foreach(e => c += e)
Run Code Online (Sandbox Code Playgroud)
在我使用该选项之前,我的服务器计算机中的所有 24 个核心在文件读取期间都处于繁忙状态。选择后,只有两个线程在忙。

这是我在开发机器上而不是服务器上捕获的内存配置文件。我首先执行 GC 来获取基线,然后多次运行上述代码。伊甸园空间会定期进行清理。内存摆动约为 20M,而我读取的较小文件约为 200M,即io.Source每次运行创建 10% 的临时对象。

这个特性会给共享系统带来麻烦。这也将限制我们同时处理多个大文件。这会增加内存、I/O 和 CPU 使用率,导致我无法将代码与其他生产作业一起运行,而是单独运行以避免对系统产生影响。
如果您知道在真实共享生产环境中处理这种情况的更好方法或建议,请告诉我。