gpt4 book ai didi

java - Scala 中 OutOfMemoryError 的原因是什么?

转载 作者:行者123 更新时间:2023-11-29 09:47:06 25 4
gpt4 key购买 nike

我才刚刚开始学习 Scala,来自 Python。我正在尝试在 Scala 中执行基本的文件处理任务。任务是使用正则表达式从数据文件中删除像 "[ ... ]" 这样的子字符串。该脚本成功处理了前几个文件,然后抛出 java.lang.OutOfMemoryError: Java heap space 错误。发生错误的数据文件大约为 70MB,我有 16GB 的 RAM 可供使用。 (前面6个文件的文件大小<100Kb,第一个异常(exception):5.5MB)。

我的问题是:是什么原因导致了 OutOfMemoryError我该如何改变我的方法来防止它发生?我不知道明白为什么会这样。我对调试内存错误的经验很少,因为Python在内存管理方面相对宽松。

任何关于编码风格或我使用的方法的额外评论都非常受欢迎 - 我渴望学习。

正则表达式.scala:

import scala.io.Source 
import java.io._

object Regexer {

def main(args: Array[String]): Unit = {

val filenames = Source.fromFile("all_files.txt").getLines()

for (fn <- filenames) {

val datafile:String = Source.fromFile(fn).mkString

val new_data:String = datafile.replaceAll(raw"\[.*?\]", "")

val file = new File(fn)
val bw = new BufferedWriter(new FileWriter(file))
bw.write(new_data)
bw.close()


}
}
}

all_files.txt 是一个包含所有要处理的文件的路径的文件(因为它们位于子目录中)。

最后是执行时抛出的完整错误信息:

java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:596)
at java.lang.StringBuilder.append(StringBuilder.java:190)
at scala.collection.mutable.StringBuilder.appendAll(StringBuilder.scala:249)
at scala.io.BufferedSource.mkString(BufferedSource.scala:97)
at Regexer$$anonfun$main$1.apply(Regexer.scala:12)
at Regexer$$anonfun$main$1.apply(Regexer.scala:10)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
at Regexer$.main(Regexer.scala:10)
at Regexer.main(Regexer.scala)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at scala.reflect.internal.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:70)
at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31)
at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:101)
at scala.reflect.internal.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:70)
at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:101)
at scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:22)
at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39)
at scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:29)
at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39)
at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:65)
at scala.tools.nsc.MainGenericRunner.run$1(MainGenericRunner.scala:87)
at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:98)
at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103)
at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala)

最佳答案

您的计算机上可能有 16Gib,但这并不意味着 JVM 可以使用所有这些。 Scala 代码(通常)在 Java 虚拟机 (JVM) 中运行,它有自己的内存。您可用的默认内存量对于您的程序来说可能太低了。您可以使用 -Xmx 选项设置进程的最大可用内存。尝试类似 java -Xmx1024m Regexerjava -Xmx2g Regexer 或您认为应该工作的任何内存。如果在增加处理文件所需的可用内存后问题仍然存在,那么可能存在内存泄漏,或者需要优化算法。

在您的特定情况下,不是将整个文件加载到内存中,而是考虑逐行处理或其他一些缓冲量,以便在任何时候您只需要将文件的一小部分保留在内存中

关于java - Scala 中 OutOfMemoryError 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40406270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com