ysymi
V2EX  ›  问与答

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

  •  
  •   ysymi · Oct 3, 2016 · 2644 views
    This topic created in 3596 days ago, the information mentioned may be changed or developed.

    背景是这样的,在研究 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 replies    2016-10-03 22:37:47 +08:00
    htfy96
        1
    htfy96  
       Oct 3, 2016 via Android   ❤️ 1
    数据库会倾向于把一次写的东西压成一块,所以具体写入的内容可能不一样。
    数据一样是当然的,否则就破坏了语义。
    换成 100 提交一回可能的结果是不太容易丢数据,但慢一些
    ysymi
        2
    ysymi  
    OP
       Oct 3, 2016
    @htfy96 嗯 这个也能明白 批量操作比逐个操作肯定要耗费性能。 我觉得是 commit 完会有一个同步到磁盘的操作,这个操作比较耗费性能
    htfy96
        3
    htfy96  
       Oct 3, 2016 via Android
    @ysymi 不一定,每次 commit 只是可能对应了数据库 write ,之后, libc/操作系统不一定立即写入。如果在 leveldb 等数据库中把同步模式打开(立即写入, fsync),那么性能会骤降到每秒几十次
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2634 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:05 · PVG 19:05 · LAX 04:05 · JFK 07:05
    ♥ Do have faith in what you're doing.