HotXLS shranjuje celice delovnih listov v kompaktnih blokih po 256 vrstic, oblikovanje vrstic, stolpcev in pravokotnikov razreši skozi lenje prekrivne plasti namesto da bi ustvarjal objekte celic, ob shranjevanju pa vsako vrstico pretaka naravnost v tok deflate paketa. Skupaj te tri spremembe odločajo o profilu pomnilnika velikega delovnega zvezka: vrhunska poraka sledi največji posamični vrstici in ne velikosti popolnega XML delovnega lista
Razlog, zakaj to šteje, je oblika, s katero se vsak razvijalec preglednic prej ali slej sreča. Uporabnik oblikuje celoten stolpec — en klik, milijon celic — naiven model objektov pa odgovori z dodelitvijo milijona objektov celic, ki držijo en indeks oblike zapisa števila. Datoteka na disku ostane drobna, ker format XLSX to izrazi kot en sam vnos <col>. Proces ne ostane droben nikakor
Zakaj oblikovanje stolpca stane več pomnilnika kot njegovo polnjenje?
Ker oblikovanje nima podatkov, ki bi upravičili objekt. Celica z vrednostjo mora obstajati nekje. Celica, ki je prazna, a oblikovana, obstaja le, da nosi indeks sloga, materializacija milijonov takih pa je klasičen način, kako aplikaciji preglednic Delphi zmanjka naslovnega prostora na datoteki, ki jo Excel odpre hipoma
Prekrivne plasti slogov to potrebo odstranijo. Navodilo za oblikovanje vrstice, stolpca ali pravokotnika je shranjeno enkrat kot razpon plus deli sloga, ki jih prispeva, in se lenje razreši, ko je celica v tem razponu dejansko dostopana. Plasti preživijo strukturna urejanja — vstavljanje vrstice znotraj oblikovanega bloka premakne interval namesto da bi ga znova zgradilo — in povratno potujejo kot kompaktni vnosi stolpcev, vrstic in celic samo s slogom, kar je natanko tako, kot jih zapisuje Excel
var
Sheet: TXLSXWorksheet;
State: TXLSXCellStyleState;
begin
Sheet := Workbook.Sheets[1];
// Style indexes come from the workbook style pools, e.g. from a cell
// you have already formatted the way you want the range to look
State := BuildStateFromTemplateCell(Sheet.Cells.Item[1, 1]);
// Format columns B..D without creating a single empty cell object
Sheet.StyleOverlays.Add(1, 2, MaxRowIndex, 4,
[xfpNumberFormat, xfpAlignment], State);
end;
TXLSXFormatParts je množica, ki odloča, kaj plast prispeva: xfpFont, xfpFill, xfpBorder, xfpNumberFormat, xfpAlignment in xfpProtection. Poimenovanje samo delov, ki jih mislite, je tisto, kar omogoča, da se plasti smiselno skladi — plast stolpca, ki dobavi obliko zapisa števila, se ne bori s plastjo vrstice, ki dobavi polnilo, ker nobena ne zahteva dela druge
Kaj vam da blok 256 vrstic
Lokalnost. Celice se držijo v blokih po 256 vrstic s stabilnimi javnimi ročaji, serializirane po vrsticah, tako pisanje delovnega lista hodi po pomnilniku v vrstnem redu, v katerem bo oddajalo bajte, in ne lovi kazalcev po kopici. Stabilni ročaji štejejo za ploskev API: ročaj, ki ga drži klicatelj, ostane veljaven čez interno reorganizacijo, ki jo izvaja postavitev blokov, kar naredi kompaktno predstavitev podrobnost implementacije in ne prelomne spremembe
Stiskanje bazena slogov teče ob njem. Pred vsakim shranjevanjem se pisave, polnila, obrobe, oblike zapisa števila, poravnave in zaščite, ki jih ne referencira nobena celica, izpustijo. Dolgoživi delovni zvezki kopičijo nereferencirane zapise slogov tako kot dolgoživi dokumenti nekoriščene sloge, delovni zvezek, ki ga je uporabnik urejal uro, pa lahko v datoteko nosi na stotine takih, ki jih nihče nikoli ne bo prebral
Shranjevanje s pretokom vrstic in kdaj ne velja
Z omogočenim StreamingWrite — privzeto — se vsaka vrstica delovnega lista zapiše neposredno v tok deflate paketa. Nadomestilo, ki ga zastavica izklopi, najprej zgradi popoln XML delovnega lista in ga stisne pozneje, tako vrhunski pomnilnik skała s celotnim listom. Pretakanje naredi, da skała z eno vrstico
Deljene nize in pomožne dele vodi ista disciplina skozi enega večkratno uporabnega serializatorja UTF-8, ki vnose oddaja enega naenkrat in vrhunski pomnilnik omejuje z največjim posamičnim vnosom in ne s celotnim delom. To pokriva tabelo deljenih nizov in zapise vrtilnih tabel, ki so pri širokem analitičnem delovnem zvezku pogosto večji od kateregakoli posamičnega delovnega lista
var
Workbook: TXLSXWorkbook;
begin
Workbook := TXLSXWorkbook.Create(nil);
try
Workbook.Open('ledger-2026.xlsx');
// StreamingWrite defaults to True; turn it off only when a downstream
// step requires the whole worksheet XML to exist before compression
Workbook.StreamingWrite := True;
Workbook.SaveAs('ledger-2026-out.xlsx');
finally
Workbook.Free;
end;
end;
Pustite ga vklopljenega, razen če imate konkreten razlog, da ne. Nepretočna pot obstaja za primere, ko nekaj drugega v cevovodu potrebuje sestavljen XML, plačevanje zanj privzeto pa je plačevanje za primer, v katerega večina aplikacij nikoli ne zaide
Kako ugotoviti, ali se plasti dejansko uporabljajo
Opazujte število celic in ne graf pomnilnika. Če delovni list po obsežnem oblikovanju poroča o verjetnem številu fizičnih celic, plasti delujejo. Če število skoči za velikost oblikovanega razpona, je nekaj v poti kode materializiralo celice — običajno zanka, ki prebere vsako celico v razponu, da preveri njen slog, kar vsili razrešitev celico za celico in porazi celotno ureditev
Razrešite slog, ko potrebujete efektivno obliko ene celice. Ne razrešujte sloga za milijon celic, da izveste, da ima stolpec obliko zapisa števila; vprašajte plast. Isto pravilo velja za pisanje: dodelite vrednosti celicam, ki imajo vrednosti, in pustite oblikovanju, da ostane interval
Kam gre preostali pomnilnik
Ko sta celice in slogi kompaktna, sta naslednja največja porabnika pri velikem delovnem zvezku tabela deljenih nizov in katerikoli satelitski deli, ki jih datoteka nosi — predpomnilniki vrtilnih tabel, risbe, ohranjen XML delov, ki jih model objektov ne modelira. Ti imajo svoje strategije in iskren odgovor je, da nobena posamična nastavitev ne reši vseh naenkrat
Če je ozko grlo odpiranje in ne shranjevanje, je izbirno nalaganje ročka: sprehod skozi nalaganje samo z metapodatki in izbirno nalaganje delovnih listov obravnava branje delovnega zvezka brez plačila za liste, ki se jih ne boste dotaknili. Za prepustnost poti branja pri zelo velikih datotekah glejte zapiske o vzporednem razčlenjevanju XLSX in dodeljevalniku pomnilnika, za izhodne obremenitve, ki nikoli ne potrebujejo modela objektov, pa je prenosni zapisi za paketske službene naloge običajno boljši fit kot kakršnokoli količinsko uglaševanje tukaj
HotXLS bere in zapisuje XLS in XLSX iz izvorne kode Delphi in C++Builder brez namestitve Excel in brez avtomatizacije OLE, kar naredi te značilnosti pomnilnika sploh opazne in nadzorljive — stran komponente preglednic HotXLS našteva podprte formate in različice RAD Studio