你好杰米 2018-07-02 09:36 采纳率: 87.5%
浏览 3754
已采纳

[java]为什么我IO读写文件的速度逐渐变慢,刚开始特别快

标题说的不太详细
就是我的程序不断的往一个*.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类型的文件
我测试的时候,在第一次运行的时候,特别快,十分之一
但是多运行几次后,速度直线下降

  • 写回答

13条回答

  • zhangpan_soft 2018-07-05 09:46
    关注

    看你们说了这么多,真是8仙过海,各显神通!我也说两句!
    首先AutoCloseable是jdk1.7以上属性,会自动关闭io流!!!所以说楼上有人说会因为流没关闭的原因显然是不成立的!!!
    楼上有人说文件大文件操作文件,小文件操作内存,其为可能原因!但是看楼主用了buffer缓冲流,所以此点也不是核心原因!
    个人觉得,其最主要的核心原因是addPhone方法的内部实现算法,就如楼上所说,算法复杂度是怎样的,我觉得这是重中之重!
    楼主可以单独检测addPhone方法,看其执行时间是不是递增的,个人觉得应该是线性递增.或指数递增,线性递增的可能性比较大!
    因此在你文件越来越大的时候就会越来越慢!另外,个人觉得你的addPhone应该有临界值,过临界值可能算法复杂度会突然变化较大!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(12条)

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?