在四库全书考据级搜索引擎开发中,文章需要按句号分拆,显示文章时需要重新拼接起来。
刚开始使用拼接方法是“+”。如:
restr+=juzi
由于文章最大达到30000多句,上面的句子总被提示异常信息,然后程序挂掉,百思不得其解。后来改用bytes.Buffer拼接方法,问题消失,网站程序稳定运行。
总结出来估计是使用“+”的拼接方法每次运算都会产生一个新的字符串。所以使用运算符"+"连接字符串会产生很多临时的无用的字符串,会给 gc 带来额外的负担,导致网站程序挂掉。
附源代码:
func Pquanwen(id, l string) (html, skid string) {
pfx := "qj-" + id
randdata, _ := Db.Get([]byte(pfx), nil)
rands := strings.Split(string(randdata), "-")
//使用范围迭代遍历数据库内容的子集
ib, err := strconv.Atoi(rands[0])
if err != nil {
fmt.Println(rands[0])
return "", "1"
}
ie, err := strconv.Atoi(rands[1])
if err != nil {
fmt.Println(rands[1])
return "", "1"
}
if ie <= ib { //以防意外
fmt.Println("ie <= ib", id, ie)
return "", "1"
}
skid = rands[0]
b := "sk-" + Inttostr(rands[0])
e := "sk-" + Inttostr(rands[1])
loop := 0
iter := Db.NewIterator(&util.Range{Start: []byte(b), Limit: []byte(e)}, nil)
nr := ""
var value []byte
var values []string
var buf bytes.Buffer
for iter.Next() {
value = iter.Value()
if value == nil {
continue
}
values = strings.Split(string(value), "-")
if len(values) < 2 {
fmt.Println(values)
continue
}
nr = values[1]
if strings.TrimSpace(nr) == "" {
continue
}
if l == "1" {
nr = pubgo.Jf(nr, true)
}
if nr == "" {
continue
}
buf.WriteString(nr)
/*rstr += nr*/
if !strings.Contains(nr, "<") || !strings.Contains(nr, ">") {
buf.WriteString("。") //rstr += "www.skqs12.com"
}
loop++
if loop > 36725 {
fmt.Println(id, "loop > 36725")
break
}
}
iter.Release()
err = iter.Error()
if err != nil {
fmt.Println(err)
}
html = buf.String()
return //+ "|" + dirhtml
}