我有以下程序在大小为2GB且带有80M行的txt文件上运行。 txt文件的每一行都具有以下格式:
word1_POSTAG word2_POSTAG频率
例如:
academy_NN award_NN 200
我逐行读取文件并从每行提取和存储信息的while循环非常快地耗尽了我所有的16GB内存(在35M左右)。
我似乎没有发现问题。我试图强制垃圾收集,并在每次迭代使用后使elements
和tmp
为null,但这些都不起作用。
BufferedReader tagged = new BufferedReader(
new InputStreamReader(
new FileInputStream(p2_POSTagged_bigrams), "UTF8"));
HashMap<String,TaggedNgram_v2> taggedEtFreq = new HashMap();
int linecount = 0;
String s1 = "";
while((s1=tagged.readLine()) != null){
linecount++;
if(linecount % 1000000 == 0){
System.out.println("processing line: "+linecount);
}
String[] elements =s1.split("[ _]");//s1 format: academy_NN award_NN 254
if(!taggedEtFreq.containsKey(elements[0].concat(" ").concat(elements[2])) ){
TaggedNgram_v2 tmp = new TaggedNgram_v2();
tmp.addTags(elements[1].concat(" ").concat(elements[3]));
tmp.addTagFrequency(Integer.parseInt(elements[4]));
taggedEtFreq.put(elements[0].concat(" ").concat(elements[2]), tmp);
}else{
TaggedNgram_v2 tmp = taggedEtFreq.get(elements[0].concat(" ").concat(elements[2]));
tmp.addTags(elements[1].concat(" ").concat(elements[3]));
tmp.addTagFrequency(Integer.parseInt(elements[4]));
taggedEtFreq.put(elements[0].concat(" ").concat(elements[2]), tmp);
}
}
我定义TaggedNgram_v2
类如下。
class TaggedNgram_v2 {
private List<String> tags = new ArrayList();
private List<Integer> tagFrequencies = new ArrayList();
public List<String> getTags() {
return tags;
}
public void addTags(String tag) {
tags.add(tag);
}
public List<Integer> getTagFrequency() {
return tagFrequencies;
}
public void addTagFrequency(int tagFrequency) {
tagFrequencies.add(tagFrequency);
}
}