开发者社区> 问答> 正文

大家用 htmlparser提取文本内容时 有没有出现内存溢出呀:报错

   public static String getDocument(File html) {  
        String htmlPath = html.getAbsolutePath();  
        String text = "";  
        Parser parser = null;  
        try {  
            parser = new Parser(htmlPath);  
        } catch (ParserException e) {  
            e.printStackTrace();  
        }  
       try {  
           parser.setEncoding("UTF-8");  
           // parser.setEncoding("gbk");  
       } catch (ParserException e) {  
           e.printStackTrace();  
       }  
       HtmlPage visitor = new HtmlPage(parser);  
       try {  
           parser.visitAllNodesWith(visitor);  
       } catch (ParserException e) {  
           e.printStackTrace();  
       }  
       NodeList nodes = visitor.getBody();  
       int size = nodes.size();  
       for (int i = 0; i < size; i++) {  
           Node node = nodes.elementAt(i);  
           text += node.toPlainTextString();  
       }  
       return text;  
   }  
我在循环读取HTML文件中的文本内容时 大概到1000+个文件以后
每个HTML文件大小是1M
parser.visitAllNodesWith(visitor);这行会内存溢出
不知道大家有碰到没? 或者给点解决的思路吧?
TOMCAT的内存已经一个G拉

展开
收起
kun坤 2020-06-07 22:04:42 429 0
1 条回答
写回答
取消 提交回答
  • 完整异常信息如下:

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at org.htmlparser.lexer.Stream.fill(Stream.java:162)
        at org.htmlparser.lexer.Stream.read(Stream.java:266)
        at java.io.InputStream.read(InputStream.java:163)
        at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)
        at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)
        at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:158)
        at java.io.InputStreamReader.read(InputStreamReader.java:167)
        at org.htmlparser.lexer.InputStreamSource.fill(InputStreamSource.java:345)
        at org.htmlparser.lexer.InputStreamSource.read(InputStreamSource.java:395)
        at org.htmlparser.lexer.Page.getCharacter(Page.java:704)
        at org.htmlparser.lexer.Lexer.parseTag(Lexer.java:1009)
        at org.htmlparser.lexer.Lexer.nextNode(Lexer.java:368)
        at org.htmlparser.scanners.CompositeTagScanner.scan(CompositeTagScanner.java:110)
        at org.htmlparser.util.IteratorImpl.nextNode(IteratorImpl.java:91)
        at org.htmlparser.Parser.visitAllNodesWith(Parser.java:726)
        at ch2.lucenedemo.lucene29.SolrjClient8080.getDocument(SolrjClient8080.java:323)
        at ch2.lucenedemo.lucene29.SolrjClient8080.createIndex(SolrjClient8080.java:243)
        at ch2.lucenedemo.lucene29.SolrjClient8080.main(SolrjClient8080.java:139)
    ######

    我认为可能的解决方案有:

    第一、

    不用String,改为用StringBuffer试试。

    第二、

    调大Java VM的内存,不过当读取的内容增大到一定程度还会发生同样的问题。

    第三、

    可以采用分段读取或者读一段存一段(比如存到硬盘中),有点类似操作系统中的缓存(缓存大小有限度,当满了则全部写入,再读)。

    不知道能否解决你的问题~

    ######

    别用这东西了,用jsoup吧,简单方便

    ######

    谢谢2位的回答

    我都试试

    2020-06-07 22:04:48
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
内存取证与IaaS云平台恶意行 为的安全监控 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载
低代码开发师(初级)实战教程 立即下载