Browse Source

:zap: 优化清理未引用资源内存占用 https://github.com/siyuan-note/siyuan/issues/5200

Liang Ding 3 years ago
parent
commit
8589a53ee4
2 changed files with 42 additions and 22 deletions
  1. 20 9
      kernel/model/assets.go
  2. 22 13
      kernel/model/tree.go

+ 20 - 9
kernel/model/assets.go

@@ -446,21 +446,32 @@ func UnusedAssets() (ret []string) {
 	if nil != err {
 		return
 	}
+	luteEngine := NewLute()
 	for _, notebook := range notebooks {
 		notebookAbsPath := filepath.Join(util.DataDir, notebook.ID)
-		trees := loadTrees(notebookAbsPath)
 		dests := map[string]bool{}
-		for _, tree := range trees {
-			for _, d := range assetsLinkDestsInTree(tree) {
-				dests[d] = true
+		pages := pagedPaths(notebookAbsPath, 20)
+		for _, paths := range pages {
+			var trees []*parse.Tree
+			for _, localPath := range paths {
+				tree, loadTreeErr := loadTree(localPath, luteEngine)
+				if nil != loadTreeErr {
+					continue
+				}
+				trees = append(trees, tree)
 			}
+			for _, tree := range trees {
+				for _, d := range assetsLinkDestsInTree(tree) {
+					dests[d] = true
+				}
 
-			if titleImgPath := treenode.GetDocTitleImgPath(tree.Root); "" != titleImgPath {
-				// 题头图计入
-				if !sql.IsAssetLinkDest([]byte(titleImgPath)) {
-					continue
+				if titleImgPath := treenode.GetDocTitleImgPath(tree.Root); "" != titleImgPath {
+					// 题头图计入
+					if !sql.IsAssetLinkDest([]byte(titleImgPath)) {
+						continue
+					}
+					dests[titleImgPath] = true
 				}
-				dests[titleImgPath] = true
 			}
 		}
 

+ 22 - 13
kernel/model/tree.go

@@ -22,6 +22,7 @@ import (
 	"path/filepath"
 	"strings"
 
+	"github.com/88250/lute"
 	"github.com/88250/lute/parse"
 	"github.com/88250/protyle"
 	"github.com/siyuan-note/filelock"
@@ -30,8 +31,9 @@ import (
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
-func loadTrees(localPath string) (ret []*parse.Tree) {
-	luteEngine := NewLute()
+func pagedPaths(localPath string, pageSize int) (ret map[int][]string) {
+	ret = map[int][]string{}
+	page := 1
 	filepath.Walk(localPath, func(path string, info fs.FileInfo, err error) error {
 		if info.IsDir() && strings.HasPrefix(info.Name(), ".") {
 			return filepath.SkipDir
@@ -41,23 +43,30 @@ func loadTrees(localPath string) (ret []*parse.Tree) {
 			return nil
 		}
 
-		data, err := filelock.NoLockFileRead(path)
-		if nil != err {
-			util.LogErrorf("get data [path=%s] failed: %s", path, err)
-			return nil
-		}
-
-		tree, err := protyle.ParseJSONWithoutFix(luteEngine, data)
-		if nil != err {
-			util.LogErrorf("parse json to tree [%s] failed: %s", path, err)
-			return nil
+		ret[page] = append(ret[page], path)
+		if pageSize <= len(ret[page]) {
+			page++
 		}
-		ret = append(ret, tree)
 		return nil
 	})
 	return
 }
 
+func loadTree(localPath string, luteEngine *lute.Lute) (ret *parse.Tree, err error) {
+	data, err := filelock.NoLockFileRead(localPath)
+	if nil != err {
+		util.LogErrorf("get data [path=%s] failed: %s", localPath, err)
+		return
+	}
+
+	ret, err = protyle.ParseJSONWithoutFix(luteEngine, data)
+	if nil != err {
+		util.LogErrorf("parse json to tree [%s] failed: %s", localPath, err)
+		return
+	}
+	return
+}
+
 var ErrBoxNotFound = errors.New("notebook not found")
 var ErrBlockNotFound = errors.New("block not found")
 var ErrTreeNotFound = errors.New("tree not found")