在四库全书考据级搜索引擎开发中,文章需要按句号分拆,显示文章时需要重新拼接起来。

刚开始使用拼接方法是“+”。如:

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

}