Tehnički članak

Pohrana ćelija u blokovima redaka i strujno spremanje XLSX-a u HotXLS-u

HotXLS pohranjuje ćelije radnog lista u kompaktnim blokovima od 256 redaka, razrješuje formatiranje redaka, stupaca i pravokutnika kroz lijene preklopne slojeve umjesto stvaranja objekata ćelija, a pri spremanju struji svaki redak izravno u deflate stream paketa. Zajedno te tri promjene odlučuju profil memorije velike radne knjige: vršna uporaba slijedi najveći pojedinačni redak, a ne veličinu cijelog XML-a radnog lista

Razlog zašto je to važno oblik je koji svaki razvojni programer proračunskih tablica naposljetku susretne. Korisnik formatira cijeli stupac, jedan klik, milijun ćelija, a naivni objektni model odgovara alociranjem milijun objekata ćelija da drže jedan indeks formata broja. Datoteka na disku ostaje sićušna jer XLSX format to izražava kao jedan unos <col>. Proces uopće ne ostaje sićušan

Zašto formatiranje stupca košta više memorije nego njegovo popunjavanje?

Zato što formatiranje nema podataka koji bi opravdali objekt. Ćelija s vrijednošću mora postojati negdje. Ćelija koja je prazna, a stilizirana, postoji samo da nosi indeks stila, a materijaliziranje milijuna takvih klasičan je način na koji Delphi aplikacija za proračunske tablice ponestane adresnog prostora na datoteci koju Excel otvara istog trenutka

Preklopni slojevi intervala stila uklanjaju potrebu. Instrukcija formatiranja retka, stupca ili pravokutnika pohranjuje se jednom kao raspon plus dijelovi stila koje doprinosi, a razrješava lijeno kad se ćelija u tom rasponu doista pristupi. Slojevi preživljavaju strukturalna uređivanja, umetanje retka unutar formatiranog bloka pomiče interval umjesto da ga ponovno izgradi, a u povratnom putu pojavljuju se kao kompaktni unosi stupaca, redaka i ćelija samo sa stilom, što je upravo onako kako ih Excel zapisuje

Dijagram preklopa intervalnog stila za HotXLS koji prikazuje raspon formatiranja stupca pohranjen kao jedan zapis s pripisanim dijelovima formata umjesto milijun praznih ćelijskih objekata u Delphiju
Format stupca, retka ili pravokutnika živi jednom kao intervalni overlay zapis koji polaže pravo samo na dijelove koje posjeduje. Efektivni stil se lijeno sklapa prvi put kad se ćelija unutar raspona stvarno dotakne
var
  Sheet: TXLSXWorksheet;
  State: TXLSXCellStyleState;
begin
  Sheet := Workbook.Sheets[1];
  // Indeksi stila dolaze iz skupova stilova radne knjige, npr. iz ćelije
  // koju ste već formatirali onako kako želite da raspon izgleda
  State := BuildStateFromTemplateCell(Sheet.Cells.Item[1, 1]);
  // Formatirajte stupce B..D bez stvaranja ijednog praznog objekta ćelije
  Sheet.StyleOverlays.Add(1, 2, MaxRowIndex, 4,
    [xfpNumberFormat, xfpAlignment], State);
end;

TXLSXFormatParts skup je koji odlučuje što sloj doprinosi: xfpFont, xfpFill, xfpBorder, xfpNumberFormat, xfpAlignment i xfpProtection. Navođenje samo dijelova koje mislite ono je što dopušta slojevima da se razumno slažu; sloj stupca koji isporučuje format broja ne sukobljava se sa slojem retka koji isporučuje ispunu, jer nijedan ne polaže pravo na dio onog drugog

Što vam daje blok od 256 redaka

Lokalitet. Ćelije se drže u blokovima od 256 redaka sa stabilnim javnim ručicama, serijalizirano po retku, pa pisanje radnog lista hoda memorijom redoslijedom kojim će emitirati bajtove, umjesto da juri pokazivače po gomili. Stabilne ručice važne su za površinu API-ja: ručica koju pozivatelj drži ostaje valjana kroz unutarnju reorganizaciju koju izvodi raspored blokova, što čini kompaktnu reprezentaciju detaljem implementacije, a ne prekinom promjenom

Dijagram pohrane blokova redaka koji prikazuje HotXLS ćelije radnog lista držane u fiksnim blokovima od 256 redaka sa stabilnim Delphi ručicama i serializacijom redak-po-redak u XLSX deflate tok
Ćelije sjede u fiksnim blokovima od 256 redaka koji alociraju samo zauzete retke i serijaliziraju istim redoslijedom kojim bajtovi napuštaju proces. Javni handleovi preživljavaju interno preuređenje, pa blokovski raspored ostaje nevidljiv pozivateljima

Kompakcija skupa stilova teče uz to. Prije svakog spremanja, fontovi, ispune, okviri, formati brojeva, poravnanja i zaštite koje nijedna ćelija ne referencira ispuštaju se. Dugovječne radne knjige nakupljaju nereferencirane zapise stilova onako kako dugovječni dokumenti nakupljaju nekorištene stilove, a radna knjiga koju je korisnik uređivao sat vremena može nositi stotine njih u datoteku iz koje ih nitko nikad neće pročitati

Spremanje strujano po retku i kad se ne primjenjuje

S StreamingWrite omogućenim, zadanim, svaki redak radnog lista zapisuje se izravno u deflate stream paketa. Alternativa, koju oznaka isključuje, najprije izgrađuje cijeli XML radnog lista, a zatim ga komprimiranja, pa se vršna memorija skalira s cijelim listom. Strujanje je čini skaliranom s jednim retkom

Dijeljeni nizovi i pomoćni dijelovi slijede istu disciplinu kroz jedan višekratni UTF-8 serijalizator koji emitira unose jedan po jedan, ograničavajući vršnu memoriju najvećim pojedinačnim unosom, a ne cijelim dijelom. To pokriva tablicu dijeljenih nizova i zapise zaokreta, koji na širokoj analitičkoj radnoj knjizi često jesu veći od bilo kojeg pojedinačnog radnog lista

var
  Workbook: TXLSXWorkbook;
begin
  Workbook := TXLSXWorkbook.Create;
  try
    Workbook.Open('ledger-2026.xlsx');
    // StreamingWrite je zadano True; isključite ga samo kada nizvodni
    // korak zahtijeva da cijeli XML radnog lista postoji prije kompresije
    Workbook.StreamingWrite := True;
    Workbook.SaveAs('ledger-2026-out.xlsx');
  finally
    Workbook.Free;
  end;
end;

Ostavite ga uključen osim ako imate konkretnog razloga za drugačije. Nestrujani put postoji za slučajeve kad nešto drugo u cjevovodu treba sastavljeni XML, a plaćanje za to zadano plaćanje je za slučaj u koji većina aplikacija nikad ne ulazi

Kako rasuđivati koriste li se slojevi doista

Pazite na broj ćelija, a ne na graf memorije. Ako radni list prijavljuje razuman broj fizičkih ćelija nakon što ste primijenili široko formatiranje, slojevi obavljaju svoj posao. Ako broj skoči za veličinu formatiranog raspona, nešto u putu koda materijaliziralo je ćelije, obično petlja koja čita svaku ćeliju u rasponu da provjeri njen stil, što prisiljava razrješavanje jednu ćeliju u vrijeme i poništava cijeli raspored

StreamingWrite dijagram koji uspoređuje deflate strujanje po retku u HotXLS-u sa sastavljanjem cijelog XML-a radnog lista u memoriji prije kompresije u Delphiju
S uključenim StreamingWrite svaki redak teče ravno u package deflate stream i maksimalna memorija prati jedan redak. Isključivanje zastavice prvo cijeli worksheet XML sklapa, što maksimalnu memoriju skalira s punim listom

Razrješite stil kad treba učinkovit format jedne ćelije. Nemojte razrješivati stil za milijun ćelija da biste saznali da stupac ima format broja, pitajte sloj. Isto pravilo vrijedi za pisanje: dodijelite vrijednosti ćelijama koje imaju vrijednosti i pustite da formatiranje ostane interval

Gdje odlazi preostala memorija

Kad su ćelije i stilovi kompaktni, sljedeći najveći potrošači na velikoj radnoj knjizi jesu tablica dijeljenih nizova i satelitski dijelovi koje datoteka nosi, predmemorije zaokreta, crteži, pohranjeni XML iz dijelova koje objektni model ne modelira. Oni imaju vlastite strategije, a iskren odgovor jest da ni jedno podešavanje ne rješava sve odjednom

Ako vam je usko grlo otvaranje, a ne spremanje, selektivno učitavanje jest poluga: prikaz učitavanja samo s metapodacima i selektivnog učitavanja radnih listova pokriva čitanje radne knjige bez plaćanja za listove koje nećete dotaknuti. Za propusnost put čitanja na vrlo velikim datotekama pogledajte bilješke o paralelnoj XLSX raščlambi i alokatoru memorije, a za opterećenja samo izlaza kojima objektni model nikad ne treba, strujna pisanja za serijske poslove poslužitelja obično su bolji pristup nego bilo koliko tuniranja ovdje

HotXLS čita i zapisuje XLS i XLSX iz izvornog Delphi i C++Builder koda bez instalacije Excela i bez OLE automatizacije, što upravo čini te značajke memorije uočljivima i upravljivima. Na stranici HotXLS Delphi komponente proračunskih tablica navedeni su podržani formati i verzije RAD Studio