【发布时间】:2014-07-01 17:04:12
【问题描述】:
我注意到以下代码使用多个线程并在读取文件时使所有 CPU 内核保持约 100% 忙碌。
scala.io.Source.fromFile("huge_file.txt").toList
我假设以下是相同的
scala.io.Source.fromFile("huge_file.txt").foreach
我在开发机器 (OS X 10.9.2) 上的 Eclipse 调试器下将此代码作为单元测试中断,并显示以下线程:main、ReaderThread、3 Daemon System Thread。 htop 显示如果我在 24 核服务器机器(ubuntu 12)的 scala 控制台中运行它,所有线程都处于忙碌状态。
问题:
- 如何限制此代码使用 N 个线程?
- 为了了解系统性能,您能否向我解释一下在 io.Source 中这是什么、为什么以及如何完成的?阅读源代码没有帮助。
- 我假设每一行都是按顺序读取的;但是,由于它使用多个线程,所以
foreach是否在多个线程中运行?我的调试器似乎告诉我代码仍在主线程中运行。
任何见解将不胜感激。
【问题讨论】:
-
您确定没有在所有线程上看到垃圾收集器活动吗?
-
我不这么认为,因为所有 24 个内核在列出列表时都接近 100%。我相信临时对象清理不应该造成如此沉重的负担。
-
也许你应该确定
-XX:+UseSerialGC? -
当您调用
toList时,您将这个非常大的文件强制存储到内存中,这绝不是一个好主意,并且可能是您在计算机上看到的所有抖动的原因。我看不到任何实际的用例,其中将一个非常大的文件完全读入内存是一个好主意。这就是为什么你从Iterator开始并且必须进行显式调用以强制它进入列表 -
不是骗人的,但人们经常问这个问题stackoverflow.com/q/23007646/1296806
标签: multithreading scala io parallel-processing