Java 处理从文本文件读取的字符串时内存使用效率低下
我有一个大约1.7GB的大文件,由2500万行组成,每行的格式如下:text,number 问题是文本可以在多行中相同,即 我是一个男孩,34岁 我是一个男孩,56岁 我在while循环中读取文件的每一行,并将字符串和数字放入hashmap中 代码:Java 处理从文本文件读取的字符串时内存使用效率低下,java,string,garbage-collection,heap,Java,String,Garbage Collection,Heap,我有一个大约1.7GB的大文件,由2500万行组成,每行的格式如下:text,number 问题是文本可以在多行中相同,即 我是一个男孩,34岁 我是一个男孩,56岁 我在while循环中读取文件的每一行,并将字符串和数字放入hashmap中 代码: InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.txt"); InputStreamReader st
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("filename.txt");
InputStreamReader stream = new InputStreamReader(is, StandardCharsets.UTF_8);
BufferedReader reader = new BufferedReader(stream);
while(true)
{
line =reader.readLine();
if (line == null)
{
break;
}
String text= line.substring(0, line.lastIndexOf(",")).trim();
String id = line.substring(line.lastIndexOf(",") + 1).trim();
hm.put(text,id);
}
其中hm是一个hashmap
我之所以使用子字符串和lastIndexOf是因为文本本身可能有逗号
我的问题是:我是否使用了太多的字符串?从文本文件中提取的重复字符串是否将作为副本保留在内存中,或者仅显示其中一个。有没有一种方法(使用字符串的intern方法或其他方法)来减少使用的字符串数量。当我使用EclipseMat分析内存使用情况时,它显示使用了大约9GB的堆空间 即使使用intern,也要在插入之前创建中间字符串;一旦它们被拘留,它们就永远不会被gc'd.@AndyTurner,但是如果有多个字符串,只有一个会创建中间形式并放入堆中,对吗?重复的字符串将被垃圾收集,因为它们不会存储在哈希映射中。顺便说一下,你的代码没有多大意义。当您到达第一个
子字符串
调用时,while
循环将清空文件,行
将为空
。所以它不应该使用任何内存。@JimMischel我已经编辑了代码。我的错误。我看错了你的密码。我对它进行了格式化,这样其他人就不会犯与我相同的错误;一旦它们被拘留,它们就永远不会被gc'd.@AndyTurner,但是如果有多个字符串,只有一个会创建中间形式并放入堆中,对吗?重复的字符串将被垃圾收集,因为它们不会存储在哈希映射中。顺便说一下,你的代码没有多大意义。当您到达第一个子字符串
调用时,while
循环将清空文件,行
将为空
。所以它不应该使用任何内存。@JimMischel我已经编辑了代码。我的错误。我看错了你的密码。我把它格式化了,这样别人就不会犯和我一样的错误。