Prijungiam load ir stats
Prijunk naujas komandas prie main.go. Pakeitimas mažas — dvi case eilutės ir
dvi eilutės pagalboje — bet failas dešinėje rodomas visas, kad matytum, kur jos
įsiterpia.
$ algo gen -n 1000 -seed 42
wrote 1000 items to library.jsonl (seed=42, order=shuffled, dup-rate=0.00)
$ algo load
loaded 1000 items from library.jsonl
slice: len=1000 cap=1024 — 24 slots reserved and unused
Tūkstantis įrašų, o vietos rezervuota 1024. Dvidešimt keturios tuščios vietos —
tai kaina už tai, kad kiti 24 append bus pigūs. Toks mainas: atmintis
mainoma į laiką, ir taip bus visame kurse.
Tikroje sistemoje: kai antraštė kainuoja daugiau už duomenis
transit — veikianti Vilniaus viešojo transporto programa — saugo grafą kaip
vieną plokščią masyvą, o ne kaip masyvą masyvų. Jos kode tai paaiškinta
vienu sakiniu: prie ~400 000 briaunų masyvų masyvas iššvaistytų megabaitus vien
antraštėms.
Suskaičiuok pats. Grafas turi 206 875 viršūnes. Jei kiekviena laikytų savo
[]int kaimynų sąrašą, tai būtų 206 875 slice antraštės × 24 baitai:
206 875 × 24 B ≈ 4,96 MB
Penki megabaitai, kuriuose nėra nė vienos briaunos — vien rodyklės, len ir
cap. Ir tai dar prieš pačias briaunas, ir prieš tai, kad 206 875 atskiri maži
masyvai gulėtų išbarstyti po atmintį, o ne iš eilės.
transit autoriai šito nepamatavo — tai sprendimas, priimtas skaičiuojant,
ir taip jis užrašytas jų kode. Skaičius viršuje irgi apskaičiuotas, o ne
pamatuotas. Skirk šiuos dalykus: 2 žingsnio lentelė yra matavimas, ši pastraipa
— argumentas. Abu naudingi, bet tik vienas iš jų yra įrodymas.