Browse Source

Reduce memory usage by writing smaller batches

Jakob Borg 10 years ago
parent
commit
9bb928bb38
1 changed files with 33 additions and 0 deletions
  1. 33 0
      internal/db/leveldb.go

+ 33 - 0
internal/db/leveldb.go

@@ -102,6 +102,9 @@ type dbWriter interface {
 	Delete([]byte)
 }
 
+// Flush batches to disk when they contain this many records.
+const batchFlushSize = 64
+
 // deviceKey returns a byte slice encoding the following information:
 //	   keyTypeDevice (1 byte)
 //	   folder (64 bytes)
@@ -275,6 +278,21 @@ func ldbGenericReplace(db *leveldb.DB, folder, device []byte, fs []protocol.File
 			}
 			moreDb = dbi.Next()
 		}
+
+		// Write out and reuse the batch every few records, to avoid the batch
+		// growing too large and thus allocating unnecessarily much memory.
+		if batch.Len() > batchFlushSize {
+			if debugDB {
+				l.Debugf("db.Write %p", batch)
+			}
+
+			err = db.Write(batch, nil)
+			if err != nil {
+				panic(err)
+			}
+
+			batch.Reset()
+		}
 	}
 
 	if debugDB {
@@ -393,6 +411,21 @@ func ldbUpdate(db *leveldb.DB, folder, device []byte, fs []protocol.FileInfo) in
 				ldbUpdateGlobal(snap, batch, folder, device, name, f.Version)
 			}
 		}
+
+		// Write out and reuse the batch every few records, to avoid the batch
+		// growing too large and thus allocating unnecessarily much memory.
+		if batch.Len() > batchFlushSize {
+			if debugDB {
+				l.Debugf("db.Write %p", batch)
+			}
+
+			err = db.Write(batch, nil)
+			if err != nil {
+				panic(err)
+			}
+
+			batch.Reset()
+		}
 	}
 
 	if debugDB {