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

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

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

    啷个阔能一小时嘛?
        9
    tomoya92   2017-07-14 22:20:34 +08:00   ♥ 1
    @hyperdak #8 FileUtils 是哪个包下的?
        10
    FreeFd   2017-07-14 22:32:06 +08:00 via Android   ♥ 1
    其实多线程写也可以呀,类似于多线程下载的技术
        11
    sagaxu   2017-07-14 23:17:15 +08:00 via Android   ♥ 1
    @FreeFd 多线程写可能会更慢
        12
    iEverX   2017-07-15 00:29:42 +08:00   ♥ 1
    只是第一行 10ms 吧,之后是顺序写,不可能一直 10ms
        13
    autulin   2017-07-15 02:26:16 +08:00 via Android   ♥ 1
    nio+内存映射
        14
    FreeFd   2017-07-15 02:58:14 +08:00 via Android   ♥ 1
    @sagaxu 如果瓶颈不是在磁盘 io 上,多线程更快些的。
        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 写文件
        16
    Valyrian   2017-07-15 04:11:11 +08:00   ♥ 1
    明显是没 buffer 吧。。
        17
    hyperdak   2017-07-15 10:49:02 +08:00
    @liygheart commons io
        18
    ihuotui   2017-07-15 18:33:23 +08:00 via iPhone
    加上 4k 才刷盘,这样比较好,或者更大块,硬盘都是大块速度快,小文件慢
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4284 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 26ms · UTC 02:30 · PVG 10:30 · LAX 18:30 · JFK 21:30
    ♥ Do have faith in what you're doing.