HotXLS çalışma sayfası hücrelerini sıkı 256 satırlık bloklarda depolar, satır, sütun ve dikdörtgen biçimlendirmesini hücre nesneleri oluşturmak yerine tembel aralık kaplamalarıyla çözer ve kaydederken her satırı doğrudan paket deflate akışına akıtır. Birlikte bu üç değişiklik büyük bir çalışma kitabının bellek profilini belirler: tepe kullanım tam çalışma sayfası XML'inin boyutunu değil en büyük tek satırı izler
Bunun önemli olduğu neden, her elektronik tablo geliştiricisinin sonunda karşılaştığı bir şekildir. Bir kullanıcı bütün bir sütunu biçimlendirir; tek tıkırtı, bir milyon hücre ve saf bir nesne modeli tek bir sayı biçimi indeksini tutmak için bir milyon hücre nesnesi ayırarak yanıtlar. Diskteki dosya küçük kalır çünkü XLSX biçimi bunu tek bir <col> girdisi olarak ifade eder. Süreç hiç küçük kalmaz
Bir sütunu biçimlendirmek neden onu doldurmaktan daha pahalı?
Çünkü biçimlendirmenin nesneyi haklı çıkaracak verisi yoktur. Değeri olan bir hücre bir yerde var olmalıdır. Boş ama stilli bir hücre yalnızca bir stil indeksi taşımak için var olur ve milyonlarca tanesini madunlaştırmak bir Delphi elektronik tablo uygulamasının Excel'in anında açtığı bir dosyada adres alanını tüketmesinin klasik yoludur
Aralık stili kaplamaları bunu gereksiz kılar. Bir satır, sütun veya dikdörtgen biçimlendirme yönergesi bir aralık artı katkıda bulunduğu stil parçaları olarak bir kez depolanır ve o aralıktaki bir hücre fiilen erişildiğinde tembel olarak çözümlenir. Kaplamalar yapısal düzenlemelerden sağ çıkıverir; biçimlendirilmiş bir bloğun içine bir satır eklemek aralığı yeniden inşa etmek yerine onu taşır; ve özdeş olarak sıkışık sütun, satır ve yalnızca stil hücre girdileri olarak gidiş-dönüş yaparlar, ki bu da Excel'in onları yazdığı şekildir
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, bir kaplamanın ne katkıda bulunduğunu kararlaştıran kümedir: xfpFont, xfpFill, xfpBorder, xfpNumberFormat, xfpAlignment ve xfpProtection. Yalnızca istediğiniz parçaları adlandırmak kaplamaların mantıklı katmanlanmasını sağlar; bir sayı biçimi sağlayan bir sütun kaplaması, bir dolgu sağlayan bir satır kaplamasıyla çekişmez, çünkü ikisi de diğerinin parçasını talep etmez
256 satırlık blok size ne verir?
Yerellik. Hücreler kararlı genel tanıtıcılara sahip 256 satırlık bloklarda tutulur, satır öncelikli serileştirilir, dolayısıyla bir çalışma sayfasını yazmak belleği bayt yayacağı sırada yürür, yığını boyunca işaretçilerin peşinden koşmak yerine. Kararlı tanıtıcılar API yüzeyi için önemlidir: çağıranın tuttuğu bir tanıtıcı blok yerleşiminin yaptığı iç yeniden düzenleme boyunca geçerli kalır, bu da sıkı temsili bir kırıcı değişiklik değil bir uygulama ayrıntısı yapar
Stil havuzu sıkıştırması onunla birlikte çalışır. Her kaydetmeden önce hiçbir hücrenin başvurmadığı yazı tipleri, dolgular, kenarlıklar, sayı biçimleri, hizalamalar ve korumalar bırakılır. Uzun ömürlü çalışma kitapları kullanılmayan stiller biriktiren uzun ömürlü belgeler gibi başvurulmamış stil kayıtları biriktirir ve bir kullanıcı tarafından bir saat düzenlenen bir çalışma kitabı yüzlercesini kimsenin hiç okumayacağı bir dosyaya taşıyabilir
Satır akışlı kaydetme ve ne zaman uygulanmaz?
StreamingWrite etkinken (öntanımlı), her çalışma sayfası satırı doğrudan paket deflate akışına yazılır. Bayrağın kapattığı alternatif, önce tam çalışma sayfası XML'ini inşa eder ve sonra sıkıştırır, dolayısıyla tepe bellek bütün sayfayla ölçeklenir. Akış onu tek bir satırla ölçeklendirir
Paylaşılan dizeler ve yardımcı parçalar, girdileri tek tek yayıp tepe belleği bütün parçaya göre değil en büyük tek girdiye göre sınırlayan yeniden kullanılabilir tek bir UTF-8 serileştiricisi aracılığıyla aynı disiplini izler. Bu, paylaşılan dize tablosunu ve özet kayıtlarını kapsar; geniş bir analitik çalışma kitabında bunlar çoğunlukla herhangi bir tekil çalışma sayfasından daha büyüktür
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;
Somut bir neden olmadıkça açık bırakın. Akışsız yol, akıştaki başka bir şeyin derlenmiş XML'e ihtiyaç duyduğu durumlar için vardır ve öntanımlı olarak onun için ödemek çoğu uygulamanın hiç çarpmadığı bir durum için ödemektir
Kaplamaların fiilen kullanılıp kullanılmadığı nasıl anlaşılır?
Bellek grafiğini değil hücre sayısını izleyin. Geniş biçimlendirme uyguladıktan sonra bir çalışma sayfası makul bir fiziksel hücre sayısı raporluyorsa, kaplamalar işlerini yapıyor demektir. Sayı biçimlendirilen aralığın boyutunda sıçrarsa, kod yolundaki bir şey hücreleri madunlaştırmış; çoğunlukla bir aralıktaki her hücrenin stilini denetlemek için okuyan ve tüm düzenlemeyi altüst eden hücre başına tek tek çözümlemeye zorlayan bir döngü
Bir hücrenin etkin biçimine ihtiyaç duyduğunuzda bir stili çözümleyin. Sütunun bir sayı biçimi olduğunu öğrenmek için bir milyon hücre için stil çözmeyin; kaplamaya sorun. Aynısı yazım için de geçerlidir: değeri olan hücrelere değerler atayın ve biçimlendirmenin bir aralık olarak kalmasına izin verin
Geri kalan bellek nereye gider?
Hücreler ve stiller sıkışık hâle geldikten sonra, büyük bir çalışma kitabındaki en büyük tüketiciler paylaşılan dize tablosu ve dosyanın taşıdığı uydu parçalardır; özet önbellekler, çizimler, nesne modelinin modellemediği parçalardan korunan XML. Bunların kendi stratejileri vardır ve dürüst cevap tek bir ayarın hepsini birden çözmeyeceğidir
Darboğazınız kaydetmek yerine açmaysa, seçmeli yükleme koldur: yalnızca üst veri ve seçmeli çalışma sayfası yükleme yazısı, bir çalışma kitabını dokunmayacağınız sayfalar için ödemeden okumayı ele alır. Çok büyük dosyalarda okuma yolu verimliliği için paralel XLSX ayrıştırma ve bellek ayırıcı notlarına bakın ve hiç nesne modeline ihtiyaç duymayan yalnızca çıktı iş yükleri için sunucu toplu işleri için akışlı yazma çoğunlukla buradaki herhangi bir miktar ayarlamadan daha iyi bir uyumdur
HotXLS, XLS ve XLSX'i Excel kurulumu ve OLE otomasyonu olmaksızın yerel Delphi ve C++Builder kodundan okur ve yazar; bu da bu bellek özelliklerini gözlemlenebilir ve denetlenebilir kılan şeydir; HotXLS elektronik tablo bileşeni sayfası desteklenen biçimleri ve RAD Studio sürümlerini listeler