V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
dltsgl
V2EX  ›  问与答

请教一下 Java 怎样写文件比较快

  •  
  •   dltsgl · 2017-07-14 19:12:39 +08:00 · 3775 次点击
    这是一个创建于 2719 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个 30 万条的大 list,逐条写到 txt 文件里,一条数据对应一行,用什么方法比较好?
    现在用 PrintWriter 的 println 一行一行写,写一行要 10ms 左右,30 万行要 1 个小时左右,太慢了。
    请教一下,应该怎样写比较快?
    18 条回复    2017-07-15 18:33:23 +08:00
    anyele
        1
    anyele  
       2017-07-14 19:17:51 +08:00 via Android   ❤️ 1
    1 小时? 我试过 Excel to txt,一行一行写,5 万行的 Excel 只需要 4-5 秒
    tanranran
        2
    tanranran  
       2017-07-14 19:20:28 +08:00   ❤️ 1
    list 转 string,然后用回车分割.然后一次性写到 txt 文件里.
    ihuotui
        3
    ihuotui  
       2017-07-14 19:30:35 +08:00 via iPhone   ❤️ 1
    nio
    af463419014
        4
    af463419014  
       2017-07-14 19:47:49 +08:00   ❤️ 1
    nio+1
    hcymk2
        5
    hcymk2  
       2017-07-14 19:59:29 +08:00   ❤️ 1
    java youclass > res.txt
    看下要花多长时间。
    Accldent
        6
    Accldent  
       2017-07-14 20:39:05 +08:00   ❤️ 1
    先用 profiler 分析下大部分时间花在了哪儿再决定怎么优化,但是这种场景下用 NIO 得不到质的提升,只是从数据流变成数据块
    hand515
        7
    hand515  
       2017-07-14 21:35:12 +08:00   ❤️ 1
    看看磁盘的 IO 性能先
    hyperdak
        8
    hyperdak  
       2017-07-14 21:57:06 +08:00   ❤️ 1
    List<String> list = Lists.newArrayList();
    FileUtils.writeLines(new File("e:\\abcdddd.txt"), "utf-8", list);

    啷个阔能一小时嘛?
    tomoya92
        9
    tomoya92  
       2017-07-14 22:20:34 +08:00   ❤️ 1
    @hyperdak #8 FileUtils 是哪个包下的?
    FreeFd
        10
    FreeFd  
       2017-07-14 22:32:06 +08:00 via Android   ❤️ 1
    其实多线程写也可以呀,类似于多线程下载的技术
    sagaxu
        11
    sagaxu  
       2017-07-14 23:17:15 +08:00 via Android   ❤️ 1
    @FreeFd 多线程写可能会更慢
    iEverX
        12
    iEverX  
       2017-07-15 00:29:42 +08:00   ❤️ 1
    只是第一行 10ms 吧,之后是顺序写,不可能一直 10ms
    autulin
        13
    autulin  
       2017-07-15 02:26:16 +08:00 via Android   ❤️ 1
    nio+内存映射
    FreeFd
        14
    FreeFd  
       2017-07-15 02:58:14 +08:00 via Android   ❤️ 1
    @sagaxu 如果瓶颈不是在磁盘 io 上,多线程更快些的。
    DCjanus
        15
    DCjanus  
       2017-07-15 03:58:18 +08:00   ❤️ 1
    持续写入,性能瓶颈主要在磁盘 IO。
    猜测其中可优化点:
    1. 使用 buffer 减少磁盘 IO 次数
    2. 一次性创建所需大小的文件后再写入,在大多数文件系统上可以获得更好的效率

    详细解释:
    1. 磁盘每次写入,不管是写入 1 个字节还是 1K 字节,只要在一定范围内,时间相差不多,所以尽量攒够一波再写入
    2. 每次都是追加文件尾,文件系统一开始并不知道你的文件大小,一开始先创建一个恰当大小的文件,文件系统更容易做出优化,不同的文件系统实现不同,此处略去。

    相关参考:
    1. 创建特定大小文件: http://jk-t.iteye.com/blog/1930414
    2. 使用 BufferedWriter 写文件
    Valyrian
        16
    Valyrian  
       2017-07-15 04:11:11 +08:00   ❤️ 1
    明显是没 buffer 吧。。
    hyperdak
        17
    hyperdak  
       2017-07-15 10:49:02 +08:00
    @liygheart commons io
    ihuotui
        18
    ihuotui  
       2017-07-15 18:33:23 +08:00 via iPhone
    加上 4k 才刷盘,这样比较好,或者更大块,硬盘都是大块速度快,小文件慢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2989 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 14:01 · PVG 22:01 · LAX 06:01 · JFK 09:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.