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

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

在 for 循環(huán)中使用數(shù)據(jù)庫(kù)連接時(shí)出現(xiàn)內(nèi)存泄漏

在 for 循環(huán)中使用數(shù)據(jù)庫(kù)連接時(shí)出現(xiàn)內(nèi)存泄漏

Go
蕭十郎 2023-08-14 16:56:28
我正在嘗試在無(wú)限 for 循環(huán)中連續(xù)查詢 Postgres 數(shù)據(jù)庫(kù)。但是,查詢似乎沒有關(guān)閉,垃圾收集器可能無(wú)法工作,并且我面臨內(nèi)存分配問題。腳本設(shè)計(jì)如下:在func main()我聲明一個(gè)全局?jǐn)?shù)據(jù)庫(kù)連接。然后執(zhí)行func checkCross(...)其中包含 for 循環(huán),每次迭代都會(huì)執(zhí)行該循環(huán),func importPrices(...)然后從數(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)我的代碼或方法中的問題出在哪里?rows.Close()我讀過(guò)一些文章,他們建議在 for 循環(huán)中使用,defer rows.Close()但這個(gè)解決方案不起作用。
查看完整描述

1 回答

?
守著一只汪

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

您在每次調(diào)用時(shí)分配兩個(gè) 10M 元素的切片(float648 字節(jié)并且更大) 。time.TimeimportPrices

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

理解該語(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 找到它并進(jìn)行收集。這種情況發(fā)生的確切時(shí)間大多是無(wú)法預(yù)測(cè)的。Go 具有復(fù)雜的動(dòng)態(tài)算法來(lái)調(diào)整GC 的速度,從而在收集垃圾所花費(fèi)的 CPU 周期數(shù)量和讓內(nèi)存消耗增長(zhǎng)之間取得一定的平衡。

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


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

添加回答

舉報(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)