超出Java GC开销限制
我正在尝试预处理一个大的txt文件(10G),并将其存储在二进制文件中以备将来使用。当代码运行时,速度会减慢,并以 线程“main”java.lang.OutOfMemoryError中出现异常:GC开销 超出限制 输入文件具有以下结构超出Java GC开销限制,java,garbage-collection,hashmap,Java,Garbage Collection,Hashmap,我正在尝试预处理一个大的txt文件(10G),并将其存储在二进制文件中以备将来使用。当代码运行时,速度会减慢,并以 线程“main”java.lang.OutOfMemoryError中出现异常:GC开销 超出限制 输入文件具有以下结构 200020000000008;0;2 200020000000004;0;2 200020000000002;0;2 200020000000007;1;2 这是我正在使用的代码: String strLine; FileI
200020000000008;0;2
200020000000004;0;2
200020000000002;0;2
200020000000007;1;2
这是我正在使用的代码:
String strLine;
FileInputStream fstream = new FileInputStream(args[0]);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
//Read File Line By Line
HMbicnt map = new HMbicnt("-1");
ObjectOutputStream outputStream = null;
outputStream = new ObjectOutputStream(new FileOutputStream(args[1]));
int sepIndex = 15;
int sepIndex2 = 0;
String str_i = "";
String bb = "";
String bbBlock = "init";
int cnt = 0;
lineCnt = 0;
while ((strLine = br.readLine()) != null) {
//rozparsovat radek
str_i = strLine.substring(0, sepIndex);
sepIndex2 = strLine.substring(sepIndex+1).indexOf(';');
bb = strLine.substring(sepIndex+1, sepIndex+1+sepIndex2);
cnt = Integer.parseInt(strLine.substring(sepIndex+1+sepIndex2+1));
if(!bb.equals(bbBlock)){
outputStream.writeObject(map);
outputStream.flush();
map = new HMbicnt(bb);
map.addNew(str_i + ";" + bb, cnt);
bbBlock = bb;
}
else{
map.addNew(str_i + ";" + bb, cnt);
}
}
outputStream.writeObject(map);
//Close the input stream
br.close();
outputStream.writeObject(map = null);
outputStream.close();
基本上,它遍历in文件并将数据存储到对象HMbicnt(这是一个哈希映射)。一旦在第二列中遇到新值,它应该将对象写入输出文件,释放内存并继续
谢谢您的帮助。简单地说,您占用了太多的内存。因为,正如您所说,您的文件是10GB,所以您无法将其全部放入内存中(当然,除非您碰巧有超过10GB的RAM,并且配置了Java来使用它)
从您的代码和描述中可以看出,您正在将整个文件读入内存,并在这样做时将其添加到一个巨大的内存映射中,然后将结果写入输出。这是不可行的。您需要重新设计代码才能正常工作(即,在任何给定时间只在内存中保留文件的一小部分)。简单地说,您使用的内存太多了。因为,正如您所说,您的文件是10GB,所以您无法将其全部放入内存中(当然,除非您碰巧有超过10GB的RAM,并且配置了Java来使用它)
从您的代码和描述中可以看出,您正在将整个文件读入内存,并在这样做时将其添加到一个巨大的内存映射中,然后将结果写入输出。这是不可行的。您需要重新设计代码才能正常工作(即,在任何给定时间只在内存中保留文件的一小部分)。简单地说,您使用的内存太多了。因为,正如您所说,您的文件是10GB,所以您无法将其全部放入内存中(当然,除非您碰巧有超过10GB的RAM,并且配置了Java来使用它)
从您的代码和描述中可以看出,您正在将整个文件读入内存,并在这样做时将其添加到一个巨大的内存映射中,然后将结果写入输出。这是不可行的。您需要重新设计代码才能正常工作(即,在任何给定时间只在内存中保留文件的一小部分)。简单地说,您使用的内存太多了。因为,正如您所说,您的文件是10GB,所以您无法将其全部放入内存中(当然,除非您碰巧有超过10GB的RAM,并且配置了Java来使用它)
从您的代码和描述中可以看出,您正在将整个文件读入内存,并在这样做时将其添加到一个巨大的内存映射中,然后将结果写入输出。这是不可行的。您需要重新设计代码以使其正常工作(即,在任何给定时间只在内存中保留文件的一小部分)。我认为问题不在于10G在内存中,而是您创建了太多的哈希映射。也许你可以清除HashMap,而不是在你不再需要它之后重新创建它。
在中似乎也存在类似的问题,这也是关于HashMaps的问题。我认为问题不在于10G在内存中,而是您创建了太多HashMaps。也许你可以清除HashMap,而不是在你不再需要它之后重新创建它。
在中似乎也存在类似的问题,这也是关于HashMaps的问题。我认为问题不在于10G在内存中,而是您创建了太多HashMaps。也许你可以清除HashMap,而不是在你不再需要它之后重新创建它。
在中似乎也存在类似的问题,这也是关于HashMaps的问题。我认为问题不在于10G在内存中,而是您创建了太多HashMaps。也许你可以清除HashMap,而不是在你不再需要它之后重新创建它。
在中似乎也存在类似的问题,这也是关于HashMaps的问题要么bblocks从不重复,导致您不断添加到同一个映射,要么
HMbicnt
的实现做了一些可疑的事情。你能展示一下addNew()
的实现和它调用的任何方法吗?要么bblocks从不重复,导致你不断地添加到同一个映射,要么HMbicnt
的实现有点可疑。你能展示一下addNew()
的实现和它调用的任何方法吗?要么bblocks从不重复,导致你不断地添加到同一个映射,要么HMbicnt
的实现有点可疑。你能展示一下addNew()
的实现和它调用的任何方法吗?要么bblocks从不重复,导致你不断地添加到同一个映射,要么HMbicnt
的实现有点可疑。您能否演示addNew()
的实现及其调用的任何方法?您可能是对的。当然,需要注意的一点是,这两个问题都可以通过简单地减少程序所需的内存总量来避免。您可能是对的。当然,需要注意的一点是,这两个问题都可以通过简单地减少程序所需的内存总量来避免。您可能是对的。当然,需要注意的一点是,这两个问题都可以通过简单地减少程序所需的内存总量来避免。您可能是对的。当然,需要注意的一点是,这两个问题都可以通过简单地减少程序所需的内存总量来避免。