V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yusheng88
V2EX  ›  程序员

对于同一文件重复写操作,有高效的写法吗

  •  
  •   yusheng88 · 2023-02-10 21:02:58 +08:00 · 1280 次点击
    这是一个创建于 412 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前写法:

        // 程序启动,读取偏移量
        Path path = Paths.get("consumer_1_offset");
        Files.readAllLines(path);
        // 业务处理 ...
        for (int i = 0; i < 111; i++) {
            // 偏移量+1
            // 业务处理 ...
            // 写入偏移量
            Files.write(path, "offset".getBytes());
        }
    

    应该有更高效的写入方式?这一直在写入流释放流的,感觉效率很低。

    10 条回复    2023-02-11 17:30:31 +08:00
    GeruzoniAnsasu
        1
    GeruzoniAnsasu  
       2023-02-10 21:12:36 +08:00
    如果你需要对数据随用随查随删随改

    为什么不数据库?
    oldshensheep
        2
    oldshensheep  
       2023-02-10 21:12:41 +08:00 via Android   ❤️ 1
    mmap
    seers
        3
    seers  
       2023-02-10 21:17:43 +08:00 via Android
    写到缓存,定时落盘
    yusheng88
        4
    yusheng88  
    OP
       2023-02-10 21:18:49 +08:00
    @oldshensheep 这个好,没使用过,一时间没想到。
    yusheng88
        5
    yusheng88  
    OP
       2023-02-10 21:21:05 +08:00
    @GeruzoniAnsasu 只是很简单的本地暂存偏移量,没必要引入数据库了。读写数据库代价也很大。
    ychost
        6
    ychost  
       2023-02-10 21:51:17 +08:00
    Sqlite 不行么
    yusheng88
        7
    yusheng88  
    OP
       2023-02-10 22:35:00 +08:00
    @ychost 可以,但不想引入 sqlite 依赖了,使用 sqlite 还要配置建表语句等操作。
    fgwmlhdkkkw
        8
    fgwmlhdkkkw  
       2023-02-11 14:19:26 +08:00 via Android
    6
    Dream95
        9
    Dream95  
       2023-02-11 16:28:51 +08:00
    操作系统本身会对文件进行缓存,内存最够的情况下这种频繁写入文件不主动 flush 就相当于在操作内存。
    代码看着是 Java ,看了下 API 内部是自动 flush 的,改成最后处理结束后再手动 flush 就 OK 了。
    yusheng88
        10
    yusheng88  
    OP
       2023-02-11 17:30:31 +08:00
    @Dream95 大概的思路就是在缓存内不断的写,达到某个临界点就刷盘。使用 FileChannel 和 mmap 写法测试了,100w 数据,前者 4.6s ,后者 0.16s
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   986 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 21:57 · PVG 05:57 · LAX 14:57 · JFK 17:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.