亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Go 程序內存消耗在 Windows Server 2016 上不斷增加

Go 程序內存消耗在 Windows Server 2016 上不斷增加

Go
冉冉說 2022-06-13 16:07:13
這是我的 Go 代碼。我使用的是 1.13 版本,一旦代碼開始運行,內存消耗就會不斷增加,不會減少。我不認為我正在創建新變量。我只是為所有存儲重用全局變量。我在網上讀到 Go 中的 GC 應該每 2 分鐘啟動一次......?編輯:我正在 Windows 任務管理器上監視程序的內存消耗。當程序開始運行時,內存從 ~5MB 開始,每分鐘增加 0.3~0.5 MB。package mainimport (    "context"    "database/sql"    "encoding/csv"    "fmt"    "log"    "os"    "path/filepath"    "runtime"    "runtime/debug"    "strings"    "time"    _ "github.com/denisenkom/go-mssqldb")var path = os.Args[1]var table = os.Args[4]var backupPath = os.Args[2]var location = os.Args[5]var server = "localhost"var port = 1433var user = "###"var password = "###"var database = os.Args[3]var ctx = context.Background()var insertQuery = "INSERT INTO [" + database + "].[dbo].[" + table + "] ([meter_id],[time_stamp],[r_voltage],[y_voltage],[b_voltage],[ry_voltage],[yb_voltage],[br_voltage],[r_current],[y_current],[b_current],[kva],[kw],[kvar],[power_factor],[freq],[kwh],[run_hr],[updated_date]) VALUES"var updateStatusQuery = "UPDATE EMS_Location_Status SET active='100',mailed='N',Updated_Date=getdate(),Error_desc='Data is coming from FTPS' where Location_Id ='" + location + "'"var db *sql.DBvar connString = fmt.Sprintf("server=%s;user id=%s;password=%s;port=%d;database=%s;",    server, user, password, port, database)var err errorvar files []stringvar tempInsertQuery stringvar csvFile *os.Filevar csvLines [][]stringvar i intvar line []stringvar point stringvar processedFile []stringvar fileName stringvar iterFile stringvar c = 10func processFile(file string, table string) {    fmt.Println("Processing file...", file)    tempInsertQuery = insertQuery + " "    csvFile, err = os.Open(file)    if err != nil {        for err != nil {            fmt.Println("Encountered error in opening file.. trying again in 10 seconds.")            time.Sleep(10 * time.Second)            csvFile, err = os.Open(file)        }        fmt.Println(err)    }任何幫助,將不勝感激!謝謝。
查看完整描述

1 回答

?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

Go 中的一般概念是任何實現io.Closer(具有Close()方法),當您有這樣一個您不打算再使用的值時,您應該調用它的Close()方法,該方法通常會釋放資源,否則可能不會立即釋放或不會立即釋放所有(曾經)。


您的db.QueryContext()調用sql.Conn.QueryContext()將返回一個*sql.Rows具有Close()方法的值。叫那個。目前,您甚至沒有存儲返回的sql.Rows.


像這樣做:


var rows *sql.Rows

rows, err = db.QueryContext(ctx, tempInsertQuery)

if err != nil {

    fmt.Println(err)

    return

}

if err2 := rows.Close(); err2 != nil {

    fmt.Println("Error closing rows:", err2

}

將此應用于Conn.QueryContext().


只要有意義,就使用defer調用此類Close()方法,因此即使您的代碼出現恐慌或return在“手動”調用之前有一條語句,它也會被執行。


您的代碼中的此類示例是csvFile.Close(). 在此之前有returns,如果執行其中一個分支,csvFile則不會關閉。


像這樣做:


csvFile, err = os.Open(file)

if err != nil {

    for err != nil {

        fmt.Println("Encountered error in opening file.. trying again in 10 seconds.")

        time.Sleep(10 * time.Second)

        csvFile, err = os.Open(file)

    }

    fmt.Println(err)

}

defer func() {

    if err2 := csvFile.Close(); err2 != nil {

        fmt.Println("Error closing csvFile:", err2

    }

}()


查看完整回答
反對 回復 2022-06-13
  • 1 回答
  • 0 關注
  • 215 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號