gpt4 book ai didi

java - 使用 vtd-xml 加载巨大的 4Gb XML 文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:20:11 24 4
gpt4 key购买 nike

我正在评估 vtd-xml 作为大型数据迁移项目的可能解决方案。输入数据是 xml 格式,如果 vtd-xml 可行,它将节省大量开发时间。我从 vtd-xml 网站运行示例 Process Huge XML Documents (Bigger than 2GB):http://vtd-xml.sourceforge.net/codeSample/cs12.html .

我成功处理了 500Mb,但遇到了可怕的 java.lang.OutOfMemoryError:4Gb 文件的 Java 堆空间错误。

  1. JVM Arguments: -Xmn100M -Xms500M -Xmx2048M.
  2. JVM Arguments: -Xmn100M -Xms500M -Xmx4096M.

还有 Maven:

  1. set MAVEN_OPTS=-Xmn100M -Xms500M -Xmx2048M
  2. set MAVEN_OPTS=-Xmn100M -Xms500M -Xmx4096M

注意:我已经使用 JVM 参数的各种组合对其进行了测试。

我研究了 vtd-xml 站点和 API 文档,并浏览了此处和其他地方的大量问题。所有 awnsers 都指向将 JVM 内存设置得更高或添加更多物理内存。 vtd-xml 网站提到内存使用量是 xml 文件大小的 1.3-1.5 倍,但如果使用 64 位,应该能够处理比可用内存大得多的文件。当然,添加 64Gb 内存来处理 35Gb xml 文件也是不可行的。

Environment:

Windows 7 64 bit. 6Gb RAM. (Closed all other apps, 85% memory avaibale)

java version "1.7.0_09"

Java(TM) SE Runtime Environment (build 1.7.0_09-b05)

Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

Eclipse Indigo

Maven 2

从 Eclipse 和 Maven 运行示例会抛出内存不足异常。

示例代码:

 import com.ximpleware.extended.VTDGenHuge;
import com.ximpleware.extended.VTDNavHuge;
import com.ximpleware.extended.XMLMemMappedBuffer;

public class App {

/* first read is the longer version of loading the XML file */
public static void first_read() throws Exception{
XMLMemMappedBuffer xb = new XMLMemMappedBuffer();
VTDGenHuge vg = new VTDGenHuge();
xb.readFile("C:\\Temp\\partial_dbdump.xml");
vg.setDoc(xb);
vg.parse(true);
VTDNavHuge vn = vg.getNav();
System.out.println("text data ===>" + vn.toString(vn.getText()));
}

/* second read is the shorter version of loading the XML file */
public static void second_read() throws Exception{
VTDGenHuge vg = new VTDGenHuge();
if (vg.parseFile("C:\\Temp\\partial_dbdump.xml",true,VTDGenHuge.MEM_MAPPED)){
VTDNavHuge vn = vg.getNav();
System.out.println("text data ===>" + vn.toString(vn.getText()));
}
}

public static void main(String[] s) throws Exception{
first_read();
//second_read();
}

}

错误:

 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at com.ximpleware.extended.FastLongBuffer.append(FastLongBuffer.java:209)
at com.ximpleware.extended.VTDGenHuge.writeVTD(VTDGenHuge.java:3389)
at com.ximpleware.extended.VTDGenHuge.parse(VTDGenHuge.java:1653)
at com.epiuse.dbload.App.first_read(App.java:14)
at com.epiuse.dbload.App.main(App.java:29)

如有任何帮助,我们将不胜感激。

最佳答案

您告诉 Java 它的最大堆大小为 2GB,然后要求它处理一个 4GB 大的 XML 文件。

要有机会进行这项工作,您需要定义一个大于您要处理的文件大小的最大堆 - 或者将处理机制更改为不需要整个文件的机制同时在内存中。

来自他们的网站,

The world's most memory-efficient (1.3x~1.5x the size of an XML document) random-access XML parser.

这意味着对于一个 4GB 的文件,您需要大约 6GB 的最大堆大小,假设您的应用不需要内存用于其他任何事情。

试试这些 JVM 参数:

-Xmn100M -Xms2G -Xmx6G

您可能仍然会用完内存,但至少现在您有机会。

哦,是的 - 您可能会发现您的 Java 现在无法启动,因为操作系统无法为 java 提供它请求的内存。如果发生这种情况,您需要一台具有更多 RAM(或者更好的操作系统)的机器

关于java - 使用 vtd-xml 加载巨大的 4Gb XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13419135/

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