aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2018-07-24 22:17:56 -0700
committerChris Lu <chris.lu@gmail.com>2018-07-24 22:17:56 -0700
commit57ded4fd80ba4eba69021c01af5ceb03b884422b (patch)
treedcbba673609f087dfec011ab38256acece1abbf2
parentea8ecf35f4372bcb2ca7fabfbb39ed819a81dcd4 (diff)
downloadseaweedfs-57ded4fd80ba4eba69021c01af5ceb03b884422b.tar.xz
seaweedfs-57ded4fd80ba4eba69021c01af5ceb03b884422b.zip
speed up leveldb bolddb loading
-rw-r--r--weed/storage/needle_map_metric.go31
1 files changed, 23 insertions, 8 deletions
diff --git a/weed/storage/needle_map_metric.go b/weed/storage/needle_map_metric.go
index 3bcb140f1..67b41f5a7 100644
--- a/weed/storage/needle_map_metric.go
+++ b/weed/storage/needle_map_metric.go
@@ -2,7 +2,6 @@ package storage
import (
"fmt"
- "github.com/chrislusf/seaweedfs/weed/glog"
. "github.com/chrislusf/seaweedfs/weed/storage/types"
"github.com/willf/bloom"
"os"
@@ -91,16 +90,32 @@ func reverseWalkIndexFile(r *os.File, initFn func(entryCount int64), fn func(key
return fmt.Errorf("unexpected file %s size: %d", r.Name(), fileSize)
}
- initFn(fileSize / NeedleEntrySize)
+ entryCount := fileSize / NeedleEntrySize
+ initFn(entryCount)
- bytes := make([]byte, NeedleEntrySize)
- for readerOffset := fileSize - NeedleEntrySize; readerOffset >= 0; readerOffset -= NeedleEntrySize {
- count, e := r.ReadAt(bytes, readerOffset)
- glog.V(3).Infoln("file", r.Name(), "readerOffset", readerOffset, "count", count, "e", e)
- key, offset, size := IdxFileEntry(bytes)
- if e = fn(key, offset, size); e != nil {
+ batchSize := int64(1024 * 4)
+
+ bytes := make([]byte, NeedleEntrySize*batchSize)
+ nextBatchSize := entryCount % batchSize
+ if nextBatchSize == 0 {
+ nextBatchSize = batchSize
+ }
+ remainingCount := entryCount - nextBatchSize
+
+ for remainingCount >= 0 {
+ _, e := r.ReadAt(bytes[:NeedleEntrySize*nextBatchSize], NeedleEntrySize*remainingCount)
+ // glog.V(0).Infoln("file", r.Name(), "readerOffset", NeedleEntrySize*remainingCount, "count", count, "e", e)
+ if e != nil {
return e
}
+ for i := int(nextBatchSize) - 1; i >= 0; i-- {
+ key, offset, size := IdxFileEntry(bytes[i*NeedleEntrySize:i*NeedleEntrySize+NeedleEntrySize])
+ if e = fn(key, offset, size); e != nil {
+ return e
+ }
+ }
+ nextBatchSize = batchSize
+ remainingCount -= nextBatchSize
}
return nil
}