Tehnični članak

Shramba celic v blokih vrstic in pretočno shranjevanje XLSX v HotXLS

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