gpt4 book ai didi

java - JSoup - Java OutOfMemoryError - 在大文件中使用 jsoup 解析器

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

我正在使用 jsoup解析器读取 HTML 文件并使用提取的数据创建 XML 文件。我将在一个目录中运行此代码/脚本,该目录包含多个 html 文件(~250k - 300k 文件),其中一些文件很大。

我遇到了一个

java.lang.OutOfMemoryError: Requested array size exceeds VM limit" or Java heap space

错误。我曾尝试使用不同的 -Xmx-Xms 值运行 VM,但我一直遇到同样的错误。我附上了我的代码片段。我假设读取大文件时发生错误。关于如何解决这个问题有什么想法吗?

String target_dir_output = "/test/";
File dir = new File(target_dir);
File[] files = dir.listFiles();
for (File f : files) {
if(f.isFile()) {
String fileName = f.getName();
String testValue = null;
try {
Document doc = Jsoup.parse(f, "UTF-8", "");
Elements metalinks = doc.select("meta[name=testValue]");
testValue = metalinks.first().attr("content");
String output = "<data>" + "\n";
output += "<testValue>" + testValue + "</testValue>" ;
output += "</data>";
FileOutputStream out = new FileOutputStream(fileName + ".xml");
out.write(output.getBytes());
out.close();
} catch (IOException e) {
e.printStackTrace();
}

最佳答案

Java 对您的程序可以分配的最大数组大小有限制。确切的限制因平台而异,但通常介于 1 到 21 亿个元素之间。

因此,当您遇到 java.lang.OutOfMemoryError: Requested array size exceeds VM limit 时,手头的应用程序正在尝试分配一个大于您的 Java 虚拟机可以支持的数组。

错误是由 JVM 中的 native 代码抛出的。它发生在为数组分配内存之前,此时 JVM 执行特定于平台的检查:分配的数据结构在该平台中是否可寻址。

此错误并不像您最初想象的那么常见。这样做的原因是基于 Java 数组由 int 索引的事实。如果你还记得,Java 中的最大正整数是 2^31 – 1 = 2,147,483,647。特定于平台的限制可能非常接近这个数字——例如,在我的 64 位 MB Pro 上的 Java 1.7 上,我可以愉快地初始化包含最多 2,147,483,645 个或 Integer.MAX_VALUE-2 个元素的数组。

将数组的长度增加 1 到 Integer.MAX_VALUE-1 会导致抛出熟悉的 OutOfMemoryError。

但限制可能不会那么高 - 在带有 OpenJDK 6 的 32 位 Linux 上,当分配一个包含约 11 亿个元素的数组时,您会遇到“java.lang.OutOfMemoryError:请求的数组大小超过 VM 限制”。要了解您的特定环境的限制,请运行一个小测试找出来。

关于java - JSoup - Java OutOfMemoryError - 在大文件中使用 jsoup 解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746189/

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