【发布时间】:2016-04-03 12:33:48
【问题描述】:
我知道在 java 中有两种读取大文本文件的方法。一种使用扫描仪,一种使用缓冲读取器。
Scanner reader = new Scanner(new FileInputStream(path));
while (reader.hasNextLine()){
String tempString = reader.nextLine();
System.out.println(java.lang.Runtime.getRuntime().totalMemory()/(1024*1024.0));
}
并且要打印的数字总是在某个值附近稳定。
但是,当我根据下面的编辑使用 bufferedReader 时,数字不稳定,它可能会在一行中突然增加(约 20mb),然后在多行(如 8000 行)中保持不变。并且该过程重复。 有谁知道为什么?
更新 我使用 BufferedReader 输入的第二种方法错误,应该是这样的
BufferedReader reader = new BufferedReader
(new InputStreamReader(new FileInputStream(path)),5*1024*1024);
for(String s = null;(s=reader.readLine())!=null; ){
System.out.println(java.lang.Runtime.getRuntime().totalMemory()/(1024*1024.0));
}
或者使用while循环
String s;
while ((s=reader.readLine())!=null ){
System.out.println(java.lang.Runtime.getRuntime().totalMemory()/(1024*1024.0));
}
更具体地说,这里是测试用例读取 250M 文件的结果
扫描仪外壳:
行号---totolmemory
5000---117.0
10000---112.5
15000---109.5
20000---109.5
25000---109.5
30000---109.5
35000---109.5
40000---109.5
45000---109.5
50000---109.5
BufferedReader 案例:
行号---totolmemory
5000---123.0
10000---155.5
15000---155.5
20000---220.5
25000---220.5
30000---220.5
35000---220.5
40000---220.5
45000---220.5
50000---211.0
但是扫描仪很慢,所以我尽量避免它。
我检查了 bufferedReader 的情况,总内存在一个随机行中突然增加。
【问题讨论】:
-
可能是
BufferedReader后面的缓冲区管理... -
您的第二个循环是一个繁忙的循环,不断获取和打印总内存。它读取一行文本,然后不断循环。
-
当您使
BufferedReader使用 5 MB 缓冲区时,您并没有真正将苹果与苹果进行比较。此外,您不会看到使用那么大的缓冲区的性能改进。您可以将该大小减小到 4 KB 或 16 KB,而不会降低性能。您将看到,BufferedReader比Scanner快很多,即使您只使用默认缓冲区大小。 -
totalMemory 与您(可能)尝试学习的内容完全无关。试试 freeMemory。
-
谢谢大家,但我还是一头雾水,我不是想比较他们使用的内存,我只是想知道为什么使用bufferedReader的内存会增加,并且会突然增加一个随机行跨度>
标签: java