Scala Akka上带有扫描程序的Java内存泄漏

Scala Akka上带有扫描程序的Java内存泄漏,scala,memory-leaks,akka,Scala,Memory Leaks,Akka,橙色是“老根”,绿色是“伊甸园空间”,蓝色是“幸存者空间”。我用你的工具做了这个分析。以下是我编写文件读取代码的方式: val inputStream = new FileInputStream("E:\\Allen\\DataScience\\train\\train.csv") val sc = new Scanner(inputStream, "UTF-8") var counter = 0 while (sc.hasNextLine) { rowActors(counter %

橙色是“老根”,绿色是“伊甸园空间”,蓝色是“幸存者空间”。我用你的工具做了这个分析。以下是我编写文件读取代码的方式:

val inputStream = new FileInputStream("E:\\Allen\\DataScience\\train\\train.csv")
val sc = new Scanner(inputStream, "UTF-8")

var counter = 0

while (sc.hasNextLine) {

  rowActors(counter % 20) ! Row(sc.nextLine())

  counter += 1
}

sc.close()
inputStream.close()

如果被扫描器读取,它看起来像是一大块内存。然而,我的原始文件只有5GB大。我想知道我是否在错误地处理文件读取过程!如果没有,我应该如何读入和处理我的文件?我现在对垃圾收集非常失望。

Akka流为并行处理文件提供了更安全的方式:

(1)我没有看到任何内存泄漏。似乎两代人都很稳定。不知道你在说什么。(2) 工具箱显示的对象大小不是累加的(如果一个字符串有100个引用,它的大小将被计数100次)。(3) 你的年轻一代似乎对scala来说太小了。增加它。(4) 为什么在scala中使用
扫描仪
?这似乎是倒退。只需对(line@Dima)执行
,非堆内存非常稳定,但堆内存从500mb增长到15gb(达到了我设置的限制)。这不应该算作内存泄漏吗?好的。我正在比较
bufferedReader
和“Source.fromFile”之间的差异…并尝试知道哪个更有效,因为我的文件有4000万行。因此,您一次在内存中创建了4000万
?15GB约为每
行375字节
。似乎很小。内存泄漏是指您分配了内存,但没有使用。在您的情况下,情况并非如此。您的内存已全部使用。糟糕透了:)@Dima我明白了!那很有帮助!有没有办法提高我的内存使用率,这样我就不会超过限制?嗯,这取决于你们的演员在做什么。我不知道akka,但一般来说,这种方法是固定数量的使用者和有限大小的队列,阻止生产者端的溢出,因此在任何给定时间内存中只有这么多对象。当然,这是假设演员产生结果,并把结果写在某个地方。如果所有的结果都在记忆中,你就必须重新思考这个方法。是的。我在邮件列表上问了这个问题,他们给了我这个答案。还是谢谢你,顺便说一句。