永发信息网

现在有一个很大的文件(>5G),我想用JAVA得到这个文件的单词有多少种和总数目,怎么做

答案:6  悬赏:30  手机版
解决时间 2021-02-07 18:31
单词(word)由字母,数字或下划线组成。遇到的问题是当我每次处理一小部分,但是总是遇到内存溢出错误部分程序如下:
public void readWord(String uri) {
strmap = new HashMap();
map = new HashMap();

try {
long start = System.currentTimeMillis();
input = new FileInputStream(getFile(uri));
channel = ((FileInputStream) input).getChannel();

for (int p = 0; p < 5; p++) {
MappedByteBuffer app = channel.map(MapMode.READ_ONLY, p / 5
* file.length(), file.length() * (p + 1) / 5);
byte[] dst = new byte[BUFFER_SIZE];// 每次读出3K的内容

for (int offset = 0; offset < app.capacity(); offset += BUFFER_SIZE) {
if (app.capacity() - offset >= BUFFER_SIZE) {
for (int i = 0; i < BUFFER_SIZE; i++) {
dst[i] = app.get(offset + i);
mapadd(dst[i]);

}
} else {
for (int i = 0; i < app.capacity() - offset; i++) {
dst[i] = app.get(offset + i);
mapadd(dst[i]);
}
}

String str[] = new String(dst,0,dst.length).split("\\W+");//每次出错的位置
//System.out.println(dst.toString());
for (int i = 0; i < str.length; i++) {
if (strmap.containsKey(str[i])) {
Long bg = strmap.get(str[i]);
strmap.put(str[i], ++bg);
} else {
strmap.put(str[i], 1l);
}
}
}
}
long end = System.currentTimeMillis();
System.out.println("**************************************");
System.out.println((end-start)/1000);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
错误异常代码:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.String.substring(Unknown Source)
at java.lang.String.subSequence(Unknown Source)
at java.util.regex.Pattern.split(Unknown Source)
at java.lang.String.split(Unknown Source)
at java.lang.String.split(Unknown Source)
at Exec9.readWord(Exec9.java:112)
at Exec9.main(Exec9.java:32)

我需要的是一个解决方案!
最佳答案
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.Scanner;

public class Test2 {
public static void main(String[] args) throws Exception{

Scanner san = new Scanner(System.in);
System.out.println("Input the text:");

String strText = san.nextLine();
String[] strArr = strText.split(" ");

File file = new File("file.txt");
FileWriter input = new FileWriter(file);
input.write(strText);
input.close();

System.out.println("单词的数目" + strArr.length);
}
}
全部回答
一般的解决方式是一次将文件中的内容读取出来如3000条,然后让程序将他处理完了以后再接着读。你要是一次读的文件太大都放内存里面的话效率低不说,内存也吃不消。尝试下多次读取
把内存扩展到8G
你把源码发来我看看 zhch_1029@163.com 还有你文件是什么格式
你这个肯定溢出了, 尝试把文件分割吧,或者把虚拟机内存设置为5G以上。
你哪儿,有eclipse文件吗?
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
河南理工科技专修学院有什么专业
淮安粥鼎记宾馆地址在什么地方,想过去办事
莎士比亚的作品是自己写还是找人代笔
淮安盛雅旅馆怎么去啊,我要去那办事
西安烈焰舞蹈培训在什么地方啊,我要过去处理
因为休病假没有体检,单位要求书面声明原因
思想教育能引导中学生养成正确的人生观 有语
淮安嘉隆宾馆地址在什么地方,想过去办事
国历八月二十四号是阴历多少号
七彩画室在哪里啊,我有事要去这个地方
谢娜的英文名字是什么啊不知道谢娜的英文名字
盱眙紫气东来商务酒店地址在什么地方,我要处
速8酒店(盱眙五洲国际店)怎么去啊,我要去
8848手机的数据线只能充电不能管理数据?
北京北路/常州街(路口)地址在什么地方,想过
推荐资讯
如何单片机控制中c语言编程,编写通过距离差对
南浦幼儿园(上海浦东新区)地址有知道的么?有
万玛擦鞋吧分店怎么去啊,有知道地址的么
波仕男装我想知道这个在什么地方
松谷庵回车场在什么地方啊,我要过去处理事情
中国移动24小时自助服务厅(富文西路营业厅)地
好孩子安全座椅靠背角度一档和二档区别
鑫昕印务怎么去啊,我要去那办事
账号 支行 行号都对为什么银行退回打款
对于后续勘察费的支付,《建设工程勘察合同示
绵竹鹏程精细化工有限责任公司在什么地方啊,
老公在妻子不知情的情况下办的信用卡打牌输了
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?