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

2016-10-03 16:11:08 +08:00
 ysymi

背景是这样的,在研究 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 的大神

2116 次点击
所在节点    问与答
3 条回复
htfy96
2016-10-03 16:27:28 +08:00
数据库会倾向于把一次写的东西压成一块,所以具体写入的内容可能不一样。
数据一样是当然的,否则就破坏了语义。
换成 100 提交一回可能的结果是不太容易丢数据,但慢一些
ysymi
2016-10-03 21:05:26 +08:00
@htfy96 嗯 这个也能明白 批量操作比逐个操作肯定要耗费性能。 我觉得是 commit 完会有一个同步到磁盘的操作,这个操作比较耗费性能
htfy96
2016-10-03 22:37:47 +08:00
@ysymi 不一定,每次 commit 只是可能对应了数据库 write ,之后, libc/操作系统不一定立即写入。如果在 leveldb 等数据库中把同步模式打开(立即写入, fsync),那么性能会骤降到每秒几十次

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

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

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

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

© 2021 V2EX