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

请教一个内存数据多次 commit 和一次 commit 的区别

  •  
  •   ysymi · 2016-10-03 16:11:08 +08:00 · 2122 次点击
    这是一个创建于 2979 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景是这样的,在研究 caffe 的时候,想把数据写到 lmdb ,有这么一段代码:

      for (){
      // read data 
      
      if (++count % 1000 == 0) {
          txn->Commit();
        }
      }  
      // write the last batch
      if (count % 1000 != 0) {
          txn->Commit();
    

    如果我换成一次提交,持久化到磁盘的文件是不一样的。
    试了每 10 次提交一回,每 100 次提交一回,每 1000 次提交一回,都不一样。但是读出来以后数据又是一样的。

    请问这是为什么呢?我想要深入的明白为什么,还需要了解哪些知识?

    先谢谢各位 v2 的大神

    3 条回复    2016-10-03 22:37:47 +08:00
    htfy96
        1
    htfy96  
       2016-10-03 16:27:28 +08:00 via Android   ❤️ 1
    数据库会倾向于把一次写的东西压成一块,所以具体写入的内容可能不一样。
    数据一样是当然的,否则就破坏了语义。
    换成 100 提交一回可能的结果是不太容易丢数据,但慢一些
    ysymi
        2
    ysymi  
    OP
       2016-10-03 21:05:26 +08:00
    @htfy96 嗯 这个也能明白 批量操作比逐个操作肯定要耗费性能。 我觉得是 commit 完会有一个同步到磁盘的操作,这个操作比较耗费性能
    htfy96
        3
    htfy96  
       2016-10-03 22:37:47 +08:00 via Android
    @ysymi 不一定,每次 commit 只是可能对应了数据库 write ,之后, libc/操作系统不一定立即写入。如果在 leveldb 等数据库中把同步模式打开(立即写入, fsync),那么性能会骤降到每秒几十次
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1062 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 45ms · UTC 19:22 · PVG 03:22 · LAX 11:22 · JFK 14:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.