读书人

请问读50m的文件 1秒读500M的文件要

发布时间: 2012-12-17 09:31:40 作者: rapoo

请教读50m的文件 1秒,读500M的文件要95秒?
import java.io.*;
import java.io.File;
import java.io.FileFilter;
import java.lang.*;
import java.util.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;

public class test
{
public static void main(String[] args) throws Exception
{
InputStream in = null;
long s = System.currentTimeMillis();
try{
byte[] tempbytes = new byte[8192];
int byteread = 0;
in = new FileInputStream("test.txt");
while ((byteread = in.read(tempbytes)) != -1){
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (in != null){
try {
in.close();
} catch (IOException e1) {
}
}
}
long e = System.currentTimeMillis() - s;
System.out.println("\nTime spend: " + e + "\t Per: " + (1.0 * e / 1000));
}
}

[最优解释]
如果你直接用C来写 64bit 应用的话,应该可以。
但为什么要把2G全部放内存中??


另外,我在我的电脑上完全测不出来你的效果,我觉得神了个奇的。。。
我还特地打开了GC日志(-XX:+PrintGCDetails),想看看有没有内存频繁回收的问题,结果1次GC都没有!

这是我程序:


public static void scan(String filename) throws IOException {
File f = new File(filename);
FileInputStream fis = new FileInputStream(f);
try {
long timer = System.currentTimeMillis();
byte[] buff = new byte[32 * 1024];
while (fis.read(buff) >= 0) {
// Do nothing
}
timer = System.currentTimeMillis() - timer;
System.out.printf("Readed: %,dKB\t\tSpend: %dms\t\tPerMS: %dKB\n", f.length() / 1024, timer, f.length() / 1024 / timer);
} finally {
fis.close();
}
}




我连续测试N个文件,大致如下:
Readed: 2,804KBSpend: 31msPerMS: 90KB
Readed: 51,459KBSpend: 559msPerMS: 92KB
Readed: 371,718KBSpend: 5361msPerMS: 69KB
Readed: 710,687KBSpend: 12316msPerMS: 57KB
Readed: 1,315,954KBSpend: 19811msPerMS: 66KB
Readed: 1,773,173KBSpend: 20217msPerMS: 87KB

最后一个文件 1.7G,也就20秒搞完,平均每毫秒读取87KB
[其他解释]
你这种测试未必准确。50M的那个文件,恐怕大半内容早就在操作系统内存里面老老实实蹲着了。

所以按如下步骤测试:
重启整个电脑,不要碰那个50M的文件,然后直接运行你的class测试程序,再看看是否还是1秒?

注意,50M的那个文件,必须不能是任何启动程序所已经使用的,必须保证其绝对没有被访问过。
[其他解释]


如果不是固态硬盘,那很正常。
[其他解释]
2G太大了,全部加载到缓存中,超出了32bit JVM的能力,要用64bit的JVM才行。。。
[其他解释]
引用:
如果不是固态硬盘,那很正常。

不是
为啥呢?有什么解决办法?

[其他解释]
引用:
引用:如果不是固态硬盘,那很正常。
不是
为啥呢?有什么解决办法?


我觉得如果是硬件问题导致的,那大概没什么解决办法————除了更换硬件。
不过你这个时间好像的确是差的多了点……
[其他解释]
引用:
引用:
引用:如果不是固态硬盘,那很正常。
不是
为啥呢?有什么解决办法?

我觉得如果是硬件问题导致的,那大概没什么解决办法————除了更换硬件。
不过你这个时间好像的确是差的多了点……

怎么来判断是硬件引起的呢?

[其他解释]
求帮助各位大神
[其他解释]
为什么不用BufferedReader
[其他解释]
我觉得,是内存不够了。 你设置一下-Xmx512m看看,减少内存垃圾回收的次数。
[其他解释]
引用:
你这种测试未必准确。50M的那个文件,恐怕大半内容早就在操作系统内存里面老老实实蹲着了。

所以按如下步骤测试:
重启整个电脑,不要碰那个50M的文件,然后直接运行你的class测试程序,再看看是否还是1秒?

注意,50M的那个文件,必须不能是任何启动程序所已经使用的,必须保证其绝对没有被访问过。


这个我测试过N次了,重启机器读是 1.5秒,第二次执行读是1秒

然后重启机器,读500M,竟然95秒,我不明白,是不是JVM内存不够?

[其他解释]
引用:
我不明白,是不是JVM内存不够?


确实有可能,虽然你所编写程序的过程是流式操作,但其实Java层面在进行读取的时候仍然是需要开辟内存空间的。

所以结合8楼的建议,你尝试在启动时增加两个JVM参数:
-Xms1024m -Xmx1024m

试试看。
[其他解释]
引用:
引用:
我不明白,是不是JVM内存不够?

确实有可能,虽然你所编写程序的过程是流式操作,但其实Java层面在进行读取的时候仍然是需要开辟内存空间的。

所以结合8楼的建议,你尝试在启动时增加两个JVM参数:
-Xms1024m -Xmx1024m

试试看。

谢谢,我还想测试过的,好像不行,我再试试
我现在就是想把一个大的文本文件,比如2G,以最快的速度加载到缓存,别的什么事也不用做的
最好不要给任何变量赋值、不管是C,还是JAVA都行

[其他解释]
谢谢
32位JVM加载500M没问题的把?

这个不是我要的效果,我希望的是50M 1.5秒,那么500M就是15秒
C:\>java -Xms1024m -Xmx1024m test

耗时: 84.227
[其他解释]
引用:

2G太大了,全部加载到缓存中,超出了32bit JVM的能力,要用64bit的JVM才行。。。


2G C可以么?

读书人网 >J2SE开发

热点推荐