标题说的不太详细
就是我的程序不断的往一个*.dat文件中追加手机号,一行一个,刚开始第一次运行的时候,没有文件,创建然后写
速度都很快,当我的文件越来越大,其实也不大,就100行左右,我要继续追加,然而速度就变得越来越慢
刚开始写200多个文件一共30-40ms,现在是300-500ms
这是为什么?
参考代码
监控中发现就这俩方法耗时间
void pickOne(File f, String fingerprint) {
long ts = System.currentTimeMillis();
try (FileInputStream fis = new FileInputStream(f)) {
String name = f.getName().split("\\.")[0];
PerfLogging.info("Loading ..... " + fingerprint + "/" + name + " from " + f.getAbsolutePath() + " ..... ");
BufferedReader buf = new BufferedReader(new InputStreamReader(fis));
String line = null;
while ((line = buf.readLine()) != null) {
addPhone(name, line);
}
buf.close();
ts = System.currentTimeMillis() - ts;
PerfLogging.info("time elapsed " + ts + "ms");
} catch (Exception e) {
e.printStackTrace();
}
}
public void dump(String basedir) {
File dir = new File(basedir, this.preHash);
for (Entry<String, Set<String>> en : this.hTab.entrySet()) {
String pre2 = en.getKey();
try (FileOutputStream fos = new FileOutputStream(new File(dir, pre2 + ".dat"))) {
for (String s : en.getValue()) {
fos.write((s + "\n").getBytes());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
这个代码不是我写的,我查到这个
java1.7特性,叫做try-with-resource,实现了AutoCloseable接口的实例可以放在try(...)中在离开try块时将自动调用close()方法。该方法调用可以看做在finally块中,所以资源的释放一定会执行,不过能不能成功释放还是得看close方法是否正常返回。
还有,我的服务器有40个G的内存,即使开给它还是很慢
我读取的是*.dat文件,不是二进制文件,可以理解成是txt类型的文件
我测试的时候,在第一次运行的时候,特别快,十分之一
但是多运行几次后,速度直线下降