dltsgl
V2EX  ›  问与答

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

  •  
  •   dltsgl · Jul 14, 2017 · 4934 views
    This topic created in 3398 days ago, the information mentioned may be changed or developed.
    一个 30 万条的大 list,逐条写到 txt 文件里,一条数据对应一行,用什么方法比较好?
    现在用 PrintWriter 的 println 一行一行写,写一行要 10ms 左右,30 万行要 1 个小时左右,太慢了。
    请教一下,应该怎样写比较快?
    18 replies  •  2017-07-15 18:33:23 +08:00
    anyele
    anyele
    Jul 14, 2017 via Android❤️1
    1
    1 小时? 我试过 Excel to txt,一行一行写,5 万行的 Excel 只需要 4-5 秒
    ByteRan
    ByteRan
    Jul 14, 2017❤️1
    2
    list 转 string,然后用回车分割.然后一次性写到 txt 文件里.
    ihuotui
    ihuotui
    Jul 14, 2017 via iPhone❤️1
    3
    nio
    af463419014
    af463419014
    Jul 14, 2017❤️1
    4
    nio+1
    hcymk2
    hcymk2
    Jul 14, 2017❤️1
    5
    java youclass > res.txt
    看下要花多长时间。
    Accldent
    Accldent
    Jul 14, 2017❤️1
    6
    先用 profiler 分析下大部分时间花在了哪儿再决定怎么优化,但是这种场景下用 NIO 得不到质的提升,只是从数据流变成数据块
    Finest
    Finest
    Jul 14, 2017❤️1
    7
    看看磁盘的 IO 性能先
    hyperdak
    hyperdak
    Jul 14, 2017❤️1
    8
    List<String> list = Lists.newArrayList();
    FileUtils.writeLines(new File("e:\\abcdddd.txt"), "utf-8", list);

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

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

    相关参考:
    1. 创建特定大小文件: http://jk-t.iteye.com/blog/1930414
    2. 使用 BufferedWriter 写文件
    Valyrian
    Valyrian
    Jul 15, 2017❤️1
    16
    明显是没 buffer 吧。。
    hyperdak
    hyperdak
    Jul 15, 2017
    17
    @liygheart commons io
    ihuotui
    ihuotui
    Jul 15, 2017 via iPhone
    18
    加上 4k 才刷盘,这样比较好,或者更大块,硬盘都是大块速度快,小文件慢
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5038 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 58ms · UTC 07:17 · PVG 15:17 · LAX 23:17 · JFK 02:17
    ♥ Do have faith in what you're doing.