Suurten taulukoiden suoratoisto
Yleiskatsaus
Erittäin suurten taulukoiden (esim. miljoonia täytettyjä soluja) lataaminen muistiin voi johtaa muistin loppumiseen 32-bittisissä prosesseissa; HotXLS tarjoaa suoratoistolukijoita ja -kirjoittajia, joiden muistinkulutus on lähes vakio ja jotka ohittavat DOM:n luonnin työkirjan jäsentämisen aikana
Direct Reader -rajapinta
TXLSDirectReader-luokka jäsentää työkirjavirrat luomatta solumalleja muistiin ja laukaisee OnSheet- ja OnCell-tapahtumat, kun valittuja soluja kohdataan
Reader := TXLSDirectReader.Create;
try
Reader.ParallelSheets := True;
Reader.ParallelMaxThreads := 4;
Reader.ParallelBufferMemoryLimit := 16 * 1024 * 1024;
Reader.OnDimension := HandleDimension;
Reader.OnColumn := HandleColumn;
Reader.OnRow := HandleRow;
Reader.OnMerge := HandleMerge;
Reader.OnCell := HandleCell;
Reader.ReadFile('large.xlsx');
finally
Reader.Free;
end;
ParallelSheets ottaa käyttöön workereittain erilliset laskentataulukon inflaterit ja XML-lukijat, kun taas kutsuva säie välittää callbackit työarkki- ja solujärjestyksessä
ParallelBufferMemoryLimit rajaa aktiivisten workerien yhteistä jonotettujen raakasolupayloadien määrää ja on oletuksena 16 MiB, kun taas ParallelPeakBufferedBytes raportoi viimeisen rinnakkaisen luvun huippuarvon diagnostiikkaa ja kapasiteettitestejä varten
Jokainen aktiivinen laskentataulukko saa itsenäisen osuuden jonobudjetista, mikä estää myöhemmän taulukon nälkiinnyttämästä parhaillaan välitettävää taulukkoa; osuuttaan suurempi yksittäinen solu hyväksytään jaettamattomana payloadina
OnDimension, OnSheetFormat, OnColumn, OnRow, OnPane ja OnMerge paljastavat käytetyn alueen, oletusleveydet ja -korkeudet, sarakejaksot, rivin korkeuden tai näkyvyyden, jäsennys- ja tyyliindeksit, ruudun tilan sekä yhdistetyt alueet rakentamatta laskentataulukkoobjekteja
Asettelucallbackit ovat valinnaisia ja suoritetaan rajatun muistin metatietovaiheessa ennen valitun taulukon OnCell-callbackeja; yhdistetyt alueet saapuvat siksi ennen yhdistämisen sisällä olevia soluja, vaikka OOXML tallentaa mergeCellsin sheetDatan jälkeen
Kun rinnakkainen taulukkojäsennys on käytössä, asettelucallbackit pysyvät kutsuvassa säikeessä ja valmistuvat valituille taulukoille ennen workerijonojen tyhjentämistä
Abortin asettaminen OnCellissä herättää tukossa olevat tuottajat ja kuluttajat, pysäyttää kesken olevat ZIP-luvut ja pakkauksen purkamisen rajatuissa sisäisissä vaiheissa, liittää kaikki workerit ja jättää lukijan uudelleenkäytettäväksi
Direct Writer -rajapinta
TXLSDirectWriter-luokka kirjoittaa rivit suoraan ZIP-tiedostopakettiin ja varmistaa minimaalisen muistiylikustannuksen suuria tietojen vientiä luotaessa
Writer := TXLSDirectWriter.Create;
try
Writer.BeginFile('large.xlsx');
Writer.AddSheet('Data');
Writer.AddRow(1);
Writer.WriteString(1, 'Quarter');
Writer.WriteString(2, 'Revenue');
Writer.AddComment(2, 1, 'Validated source', 'Reviewer');
Writer.AddImageFromFile(4, 1, 8, 12, 'logo.png',
xlsDirectImagePng, 'Company logo');
ChartIndex := Writer.AddChart(9, 1, 18, 16,
xlsDirectChartColumn, 'Revenue');
Writer.AddChartSeries(ChartIndex, 'Revenue',
'Data!$A$2:$A$5', 'Data!$B$2:$B$5');
Writer.Close;
finally
Writer.Free;
end;
AddComment kirjoittaa klassiset solukommentit tekijämetatietoineen ja vastaavine VML-kommenttimuotoineen lataamatta laskentataulukon objektimallia
AddImage, AddImageFromFile ja AddImageFromStream hyväksyvät kaksisoluiset ankkurit sekä PNG-, JPEG-, GIF-, BMP-, EMF- tai WMF-payloadit; tiedostolähteet virtaavat suoraan ZIP-alkioon, kun taulukko valmistuu, kun taas virtalähteet säilyttävät vain virtaviittauksen ja kirjatun tavualueen
Kun AddImageFromStream vastaanottaa arvon OwnsStream=True, kirjoitin vapauttaa virran laskentataulukon sivuosien viimeistelyn jälkeen; muuten kutsujan on pidettävä haettavissa oleva virta elossa seuraavaan AddSheet- tai Close-kutsuun asti
AddChart ja AddChartSeries tuottavat pylväs-, palkki-, viiva-, alue-, piirakka-, rengas- tai hajontakaavioiden ChartML:ää kaavapohjaisine sarjoineen, kun taas AddChartXml liittää täyden soittajan toimittaman kaavioosan edistyneitä kaavioperheitä ja laajennuksia varten
Kommentit, piirrosankkurit ja kaaviokuvaajat pidetään muistissa vain nykyistä laskentataulukkoa varten; sheetDatan sulkeuduttua kirjoitin tuottaa laskentataulukon relaatiot, kommentit, VML:n, DrawingML:n, median ja ChartML:n peräkkäin ja vapauttaa sivukanavatilan ennen seuraavan laskentataulukon alkua