java 读大文件报错

J2EE 码拜 9年前 (2015-04-10) 1027次浏览 0个评论

代码:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class readword {
public static String[] Return()
{

String[] mws=null;
List<String> strList = new ArrayList<String>();// 定义一个List存储读取的文本内容
List<Integer> flags = new ArrayList<Integer>();// 定义一个List存储keyword出现的行
// System.out.println(“输入分子量前的标识串如> <MOLECULAR_WEIGHT>”);
// String filter=scanner.next();//分子量前的标识串filter如> <MOLECULAR_WEIGHT>
Pattern p = Pattern.compile(“> <Mass>”);// 调用Pattern的compile方法编译要匹配的正则
Matcher m;
int j = 0, k = 0;// i=1为输出下一行内容;j为mws表长;k为记录总数
int i=1;
{
Reader re = null;
try {
re = new FileReader(new File(“E:/167m.sdf”));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BufferedReader bre = new BufferedReader(re,5*1024*1024);
try {
while (bre.ready()) {
String str = bre.readLine();
strList.add(str);
m = p.matcher(str);
if (m.find())// 查找正则匹配的子串是否存在
{
flags.add(i);// 记录匹配的行
}
i++;
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (k = 0; k < flags.size(); k++) {
/*System.out.println(“分子” + (k + 1) + “的分子量为”
+ strList.get(flags.get(k)));// 干你想干的事
*/ }
System.out.print(“共有” + k + “条记录”);
mws = new String[k];// 所有的分子量集合
for (j = 0; j < mws.length; j++) {
mws[j] = strList.get(flags.get(j));
}
System.out.println(Arrays.toString(mws));// 输出所有分子量的集合
}
return mws;
}
}
目前读10多m的文件没问题,前几天也可以读100多m的文件,今天不造改哪个地方了连100多的都运行不了。
异常代码:
Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java.util.regex.Matcher.<init>(Matcher.java:207)
at java.util.regex.Pattern.matcher(Pattern.java:888)
at readword.Return(readword.java:41)
at HashTable.hash(HashTable.java:36)
at main.main(main.java:32)

heap也设置过了 100m总不能超过内存吧。。。。弄了一天也没弄明白,希望大神们帮忙看眼TUT

java 读大文件报错
4分
JVM 参数堆设置大点。

你100M 文件读到 list 能换个思路吗

java 读大文件报错
引用 1 楼 u011278496 的回复:

JVM 参数堆设置大点。

你100M 文件读到 list 能换个思路吗

设到512m还有等待时间,设到1024直接报错。。。。
怎么换思路啊 我想用别的方法比如读流 但是数据怎么都不对。。。。索性就用这个方法了 

strList.add(str);
m = p.matcher(str);一直都是这两句报错。。。然后别的文件里引用也跟着错。。

java 读大文件报错
2分
看你的代码,strList 这个对象就没有任何意义,完全可以不要
java 读大文件报错
4分
List String StringBuffer都是有长度限制的,文件太大,只能选择分段处理!
java 读大文件报错
引用 3 楼 cheng_e_1990 的回复:

看你的代码,strList 这个对象就没有任何意义,完全可以不要

怎么不要啊0 0

java 读大文件报错
引用 4 楼 emovie 的回复:

List String StringBuffer都是有长度限制的,文件太大,只能选择分段处理!

怎么分段?能给个例子么0 0

java 读大文件报错
4分
引用 5 楼 sherrysyusuke 的回复:
Quote: 引用 3 楼 cheng_e_1990 的回复:

看你的代码,strList 这个对象就没有任何意义,完全可以不要

怎么不要啊0 0

看lz的需求,是不是只要找到匹配行的内容和对应的行号呢,需要把所有的记录放到一个临时列表吗

java 读大文件报错
引用 7 楼 cheng_e_1990 的回复:
Quote: 引用 5 楼 sherrysyusuke 的回复:
Quote: 引用 3 楼 cheng_e_1990 的回复:

看你的代码,strList 这个对象就没有任何意义,完全可以不要

怎么不要啊0 0

看lz的需求,是不是只要找到匹配行的内容和对应的行号呢,需要把所有的记录放到一个临时列表吗

就是读文件里所有的分子量 后面调用列表输出所有的分子量 存到哈希表里。

java 读大文件报错
6分
引用 6 楼 sherrysyusuke 的回复:
Quote: 引用 4 楼 emovie 的回复:

List String StringBuffer都是有长度限制的,文件太大,只能选择分段处理!

怎么分段?能给个例子么0 0

目前没有很好的解决方式,主要是速度和内存无法达成共识,要不多损耗点内存,每次多读点文件,要不就多耗点时间,记录下每次取出的文件的行数等参数,这样每次都要遍历一下文件,才能得到下一段。

java 读大文件报错
引用 9 楼 emovie 的回复:
Quote: 引用 6 楼 sherrysyusuke 的回复:
Quote: 引用 4 楼 emovie 的回复:

List String StringBuffer都是有长度限制的,文件太大,只能选择分段处理!

怎么分段?能给个例子么0 0

目前没有很好的解决方式,主要是速度和内存无法达成共识,要不多损耗点内存,每次多读点文件,要不就多耗点时间,记录下每次取出的文件的行数等参数,这样每次都要遍历一下文件,才能得到下一段。

好的 谢谢啦 我想来想去也就只能这样= =


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明java 读大文件报错
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!