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

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

使用 gob 序列化到磁盤后檢索

使用 gob 序列化到磁盤后檢索

Go
POPMUISE 2022-12-05 11:18:42
我一直在學(xué)習(xí)數(shù)據(jù)庫,并希望出于學(xué)習(xí)目的而非生產(chǎn)目的實(shí)施一個(gè)數(shù)據(jù)庫。我有一個(gè)定義的模式:type Row struct {    ID       int32    Username string    Email    string}現(xiàn)在,目前,我能夠以僅附加的方式將這種類型的結(jié)構(gòu)編碼到文件中。//Just to show i use a file for the encoding, it has missing details.func NewEncoder(db *DB) *gob.Encoder{    return gob.NewEncoder(db.File)}func SerializeRow(r Row, encoder *gob.Encoder, db *DB) {    err := encoder.Encode(r)    if err != nil {        log.Println("encode error:", err)    }}現(xiàn)在,通過簡單地解碼整個(gè)文件來模仿“選擇”語句相對容易gob.decodefunc DeserializeRow(decoder *gob.Decoder, db *DB){    var rows Row    db.File.Seek(0, 0)    err := decoder.Decode(&rows)    for err == nil {        if err != nil {            log.Println("decode error:", err)        }        fmt.Printf("%d %s %s\n", rows.ID, rows.Username, rows.Email)        err = decoder.Decode(&rows)    }}我當(dāng)前的問題是,我希望能夠根據(jù) ID 檢索特定行。我知道sqlite使用 4kb 分頁,在某種意義上,序列化的行占據(jù)一個(gè)“頁面”,即。4KB 直到一個(gè)頁面不能再容納它們,然后創(chuàng)建另一個(gè)。我如何gob以最簡單和慣用的方式模仿這種行為?
查看完整描述

1 回答

?
阿晨1998

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

一個(gè) Gob 流可能包含類型定義和解碼指令,所以你不能尋找一個(gè) Gob 流。您只能從頭開始閱讀,直到找到所需內(nèi)容為止。

Gob 流完全不適合需要跳過元素的數(shù)據(jù)庫存儲格式。

您可以創(chuàng)建一個(gè)新的編碼器并分別序列化每個(gè)記錄,在這種情況下您可以跳過元素(通過維護(hù)一個(gè)文件索引來存儲哪個(gè)記錄從哪個(gè)位置開始),但這將是非常低效和冗余的(如鏈接答案中所述,當(dāng)您寫入更多相同類型的值時(shí),速度和存儲成本會攤銷,并且總是創(chuàng)建新的編碼器會失去這種收益)。

更好的方法是不encoding/gob為此使用,而是定義自己的格式。為了有效地支持搜索(select),您必須在可搜索的列/字段上構(gòu)建某種索引,否則您仍然需要執(zhí)行全表掃描。


查看完整回答
反對 回復(fù) 2022-12-05
  • 1 回答
  • 0 關(guān)注
  • 109 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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