我正在编写一个java代码来在一个大的txt文件(6-8Gb)中搜索电子邮件地址和密码。我已经编写了代码,它可以处理 200Mb txt 文件并给出输出。但是当我输入 500Mb 文件时,它显示以下错误。
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.nio.HeapCharBuffer.<init>(HeapCharBuffer.java:57)
at java.nio.CharBuffer.allocate(CharBuffer.java:331)
at java.nio.charset.CharsetDecoder.decode(CharsetDecoder.java:792)
at regular.expression_fyp.RegularExpression_fyp.main(RegularExpression_fyp.java:56)
Java Result: 1
我是java编程新手,所以我需要你的帮助来解决这个问题。我应该怎么做才能解决这个问题?请向我发送任何建议,我也附上了我的代码。谢谢。
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegularExpression_fyp
{
public static void main(String[] argv) throws Exception {
String pattern = "\\w[%A-Za-z0-9-]+\\%40\\w+\\.com\\w[%A-Za-z0-9]+";
Pattern r = Pattern.compile(pattern);
FileInputStream input = new FileInputStream("E:\\test7.txt");
FileChannel channel = input.getChannel();
ByteBuffer bbuf = channel.map(FileChannel.MapMode.READ_ONLY, 0, (int) channel.size());
CharBuffer cbuf = Charset.forName("8859_1").newDecoder().decode(bbuf);
Matcher matcher = r.matcher(cbuf);
if (matcher.find( )) {
System.out.println("Found value: " + matcher.group(0) );
} else {
System.out.println("NO MATCH");
}
}
}
问题在于 CharBuffer 正在转换字节,从而将文件放入堆中。更有效的解决方案是为 ByteBuffer 编写一个包装器,它允许您直接访问内存映射文件。
您可以创建一个包装 ByteBuffer 的 CharSquence 来解析整个映射,而不将其放入堆中。
import java.nio.ByteBuffer;
/**
* Assumes ISO-8859-1 character encoding
*/
public class BufferCharSequence implements CharSequence {
final ByteBuffer bb;
public BufferCharSequence(ByteBuffer bb) {
this.bb = bb;
}
@Override
public int length() {
return bb.limit();
}
@Override
public char charAt(int index) {
return (char) (bb.get(index) & 0xFF);
}
@Override
public CharSequence subSequence(int start, int end) {
bb.limit(start + end);
bb.position(start);
return new BufferCharSequence(bb.slice());
}
}
注意:无论 ByteBuffer 的容量如何,这都将使用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)