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

2023-02-10 21:02:58 +08:00
 yusheng88

目前写法:

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

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

1309 次点击
所在节点    程序员
10 条回复
GeruzoniAnsasu
2023-02-10 21:12:36 +08:00
如果你需要对数据随用随查随删随改

为什么不数据库?
oldshensheep
2023-02-10 21:12:41 +08:00
mmap
seers
2023-02-10 21:17:43 +08:00
写到缓存,定时落盘
yusheng88
2023-02-10 21:18:49 +08:00
@oldshensheep 这个好,没使用过,一时间没想到。
yusheng88
2023-02-10 21:21:05 +08:00
@GeruzoniAnsasu 只是很简单的本地暂存偏移量,没必要引入数据库了。读写数据库代价也很大。
ychost
2023-02-10 21:51:17 +08:00
Sqlite 不行么
yusheng88
2023-02-10 22:35:00 +08:00
@ychost 可以,但不想引入 sqlite 依赖了,使用 sqlite 还要配置建表语句等操作。
fgwmlhdkkkw
2023-02-11 14:19:26 +08:00
6
Dream95
2023-02-11 16:28:51 +08:00
操作系统本身会对文件进行缓存,内存最够的情况下这种频繁写入文件不主动 flush 就相当于在操作内存。
代码看着是 Java ,看了下 API 内部是自动 flush 的,改成最后处理结束后再手动 flush 就 OK 了。
yusheng88
2023-02-11 17:30:31 +08:00
@Dream95 大概的思路就是在缓存内不断的写,达到某个临界点就刷盘。使用 FileChannel 和 mmap 写法测试了,100w 数据,前者 4.6s ,后者 0.16s

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/915028

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX