第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在 for 循環(huán)中使用 db 連接時(shí)內(nèi)存泄漏

在 for 循環(huán)中使用 db 連接時(shí)內(nèi)存泄漏

Go
慕容3067478 2022-04-26 16:00:19
我正在嘗試在無(wú)限 for 循環(huán)中連續(xù)查詢 Postgres 數(shù)據(jù)庫(kù)。但是,查詢似乎沒(méi)有關(guān)閉,垃圾收集器可能無(wú)法正常工作,并且我面臨內(nèi)存分配問(wèn)題。腳本設(shè)計(jì)如下:在func main()我聲明一個(gè)全局?jǐn)?shù)據(jù)庫(kù)連接。然后執(zhí)行func checkCross(...)which 包含 for 循環(huán),每次迭代執(zhí)行func importPrices(...)which 依次從數(shù)據(jù)庫(kù)中導(dǎo)入行。import (    "database/sql"    _"github.com/lib/pq"    "runtime"    )var db *sql.DBfunc main() {    var err error    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+" dbname=%s password=%s ", host, port, user, dbname, password)    //connection    db, err = sql.Open("postgres", psqlInfo)    if err != nil {        log.Fatal(err)    }    defer db.Close()    checkCross("EUR_USD")    ...函數(shù) checkCross(...)   func checkCross(instrument string) {    for i := 1; i < 4; i++ {            rawData, _ := importPrices(instrument)            var mem runtime.MemStats            runtime.ReadMemStats(&mem)            fmt.Printf("alloc [%v] \t heapAlloc [%v] \n", mem.Alloc, mem.HeapAlloc)            ...        }函數(shù)導(dǎo)入價(jià)格(...)func importPrices(instrument string) ([]float64, []time.Time) {    var price_ float64    var date_ time.Time    price := make([]float64, 10000000)    date := make([]time.Time, 10000000)    queryCommand := fmt.Sprintf("SELECT * FROM table where instrument = '%[1]v' ORDER BY 1 ASC;", instrument)    rows, err := db.Query(queryCommand)    if err != nil {        log.Fatal(err)    }    //scan from db    z := 0    for rows.Next() {        err := rows.Scan(&date_, &price_)        if err != nil {            log.Fatal(err)        }        price[z] = price_        date[z] = date_        z+=1    }    price = price[:z]     date = date[:z]     if err := rows.Err(); err != nil {        log.Fatal(err)    }    rows.Close()    return price, date輸出alloc [321664064]        heapAlloc [321664064] alloc [641723264]        heapAlloc [641723264] alloc [961781984]        heapAlloc [961781984]您能否指導(dǎo)我的代碼或方法中的問(wèn)題在哪里?我讀過(guò)一些文章,他們建議rows.Close()在 for 循環(huán)中使用而不是,defer rows.Close()但這個(gè)解決方案不起作用。
查看完整描述

1 回答

?
臨摹微笑

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊

在每次float64調(diào)用.time.TimeimportPrices

當(dāng)然,這些切片中的大多數(shù)最終都會(huì)變成垃圾(假設(shè)您用從 中返回的這兩個(gè)切片覆蓋了一些變量importPrices),但是這些垃圾會(huì)自然浮動(dòng),直到為您的程序提供支持的 Go 運(yùn)行時(shí)決定收集它。在此之前,內(nèi)存消耗將會(huì)增長(zhǎng)。

了解該語(yǔ)言的兩種“標(biāo)準(zhǔn)”實(shí)現(xiàn)(您應(yīng)該使用其中一種)具有與主程序流程并行工作的掃描GC 功能至關(guān)重要。換句話說(shuō),當(dāng)程序丟失對(duì)已分配內(nèi)存塊的最后一個(gè)實(shí)時(shí)引用時(shí),就在那一刻,該塊占用的內(nèi)存不會(huì)發(fā)生任何事情——它必須等到 GC 找到它然后收集它。發(fā)生這種情況的確切時(shí)間幾乎是不可預(yù)測(cè)的。Go 采用復(fù)雜的動(dòng)態(tài)算法來(lái)調(diào)整 GC 的速度,從而在收集垃圾所花費(fèi)的 CPU 周期數(shù)量和讓內(nèi)存消耗增長(zhǎng)之間取得某種平衡。

對(duì)于手頭的問(wèn)題,通常的方法是在迭代之間簡(jiǎn)單地重用分配的內(nèi)存。也就是說(shuō),在調(diào)用之前先分配切片importPrices,將它們傳遞到那里,然后將它們重置為零長(zhǎng)度,然后再次傳遞它們。


查看完整回答
反對(duì) 回復(fù) 2022-04-26
  • 1 回答
  • 0 關(guān)注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)