From 7fdd3104ad5904b04fab3f1f45323f654167a605 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Thu, 26 Jan 2023 20:07:06 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E6=94=B9=E8=BF=9B=E5=9D=97=E6=A0=91?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=98=E5=8F=96=20https://github.com/siyua?= =?UTF-8?q?n-note/siyuan/issues/7168?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/treenode/blocktree.go | 28 ++++++++++++++++++++-------- 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/kernel/treenode/blocktree.go b/kernel/treenode/blocktree.go index 01db7bad1..4cddf9217 100644 --- a/kernel/treenode/blocktree.go +++ b/kernel/treenode/blocktree.go @@ -29,6 +29,7 @@ import ( "github.com/88250/lute/ast" "github.com/88250/lute/parse" "github.com/dustin/go-humanize" + "github.com/panjf2000/ants/v2" util2 "github.com/siyuan-note/dejavu/util" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/util" @@ -425,11 +426,13 @@ func InitBlockTree(force bool) { } size := uint64(0) - for _, entry := range entries { - if !strings.HasSuffix(entry.Name(), ".msgpack") { - continue - } + poolSize := runtime.NumCPU() + waitGroup := &sync.WaitGroup{} + p, _ := ants.NewPoolWithFunc(poolSize, func(arg interface{}) { + defer waitGroup.Done() + + entry := arg.(os.DirEntry) p := filepath.Join(util.BlockTreePath, entry.Name()) var fh *os.File fh, err = os.OpenFile(p, os.O_RDWR, 0644) @@ -461,13 +464,22 @@ func InitBlockTree(force bool) { name := entry.Name()[0:strings.Index(entry.Name(), ".")] blockTrees.Store(name, &btSlice{data: sliceData, changed: time.Time{}, m: &sync.Mutex{}}) size += uint64(len(data)) + }) + for _, entry := range entries { + if !strings.HasSuffix(entry.Name(), ".msgpack") { + continue + } + + waitGroup.Add(1) + p.Invoke(entry) } + waitGroup.Wait() + p.Release() + runtime.GC() - - if elapsed := time.Since(start).Seconds(); 2 < elapsed { - logging.LogWarnf("read block tree [%s] to [%s], elapsed [%.2fs]", humanize.Bytes((size)), util.BlockTreePath, elapsed) - } + elapsed := time.Since(start).Seconds() + logging.LogInfof("read block tree [%s] to [%s], elapsed [%.2fs]", humanize.Bytes((size)), util.BlockTreePath, elapsed) return }