HotPDF dapat menyimpan subset font TrueType dan OpenType di disk dan menggunakannya kembali antar dokumen dan antar proses, sehingga batch yang merender sepuluh ribu rekening dengan tiga font yang sama melakukan subset font itu sekali alih-alih sepuluh ribu kali. Cache dikonfigurasi dengan dua properti, diperiksa dengan satu record, dan aman dibiarkan aktif: kegagalan cache jatuh kembali ke subsetting normal di memori dan tidak pernah menghentikan dokumen agar tidak diproduksi
Subsetting mahal karena alasan. Membangun subset berarti menelusuri glyph closure, menulis ulang loca dan glyf, membangun kembali cmap dan hmtx, dan memancarkan mapping CID yang dapat dialamatkan PDF. Untuk satu dokumen biaya itu menghilang dalam derau. Untuk server laporan yang memproduksi dokumen dalam loop, itu sering menjadi blok terbesar tunggal waktu CPU dalam run
Apa yang membuat cache hit mungkin
Empat hal harus cocok: konten font, himpunan glyph yang digunakan, mode subset, dan skema cache. Miss salah satu dan HotPDF melakukan subset dari awal, karena subset hanya dapat digunakan kembali ketika ia tetap identik byte-demi-byte
Himpunan glyph adalah kondisi yang mengejutkan orang. Dua faktur yang berbeda satu nama pelanggan menggunakan himpunan glyph berbeda, dan karenanya menghasilkan subset berbeda dan entri cache berbeda. Cache terbayar ketika dokumen berbagi repertoar glyph — rekening dari template tetap, formulir yang data variabelnya numerik, katalog yang diambil dari satu database produk — dan tidak terbayar ketika setiap dokumen menggambar irisan berbeda dari font CJK besar. Ukur sebelum berasumsi kasus mana Anda
var
Pdf: THotPDF;
Info: THPDFFontSubsetCacheInfo;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.EnableFontSubsetting := True;
Pdf.FontSubsetCacheFolder := 'C:\ProgramData\Reports\fontcache';
Pdf.FontSubsetCacheMaxBytes := 64 * 1024 * 1024; // 64 MiB, default is 256
// ... generate the batch ...
Info := Pdf.GetFontSubsetCacheInfo;
LogFmt('subset cache: %d hits, %d misses, %d bytes in %d files',
[Info.HitCount, Info.MissCount, Info.CurrentBytes, Info.FileCount]);
finally
Pdf.Free;
end;
end;
Bagaimana Anda tahu cache melakukan sesuatu?
GetFontSubsetCacheInfo mengembalikan sembilan penghitung, dan rasio antara dua yang pertama menjawab pertanyaan secara langsung. HitCount dan MissCount memberikan hit rate. WriteCount dan EvictionCount menunjukkan apakah entri bertahan cukup lama untuk digunakan kembali atau sedang didorong keluar oleh budget yang terlalu kecil. CurrentBytes dan FileCount melaporkan apa yang ada di disk sekarang
Tiga sisanya adalah yang patut diberi peringatan. CorruptCount menghitung entri yang gagal validasi dan dihapus — beberapa setelah shutdown tidak bersih adalah normal, aliran yang stabil berarti penyimpanan tidak andal. RejectedCount menghitung entri yang ditolak sebelum digunakan. WriteFailureCount menghitung entri yang sama sekali tidak dapat ditulis, yang biasanya berarti masalah izin pada folder alih-alih apa pun tentang font. Tidak satu pun dari ketiganya menghentikan generasi dokumen, yang persis mengapa Anda harus melihatnya: cache yang diam-diam tidak pernah menulis terlihat sama dari luar seperti cache yang berfungsi, kecuali untuk tagihan CPU
Eviction, budget, dan saat Anda mengecilkan salah satunya
FontSubsetCacheMaxBytes default ke 268435456 byte, itu 256 MiB, dan dapat diturunkan saat runtime. Menurunkannya memicu eviction least-recently-used segera alih-alih menunggu tulis berikutnya, jadi layanan yang merespons tekanan disk dapat membebaskan ruang pada saat ia memutuskan untuk itu, bukan pada titik nanti yang tidak ia kendalikan
Menyetel FontSubsetCacheFolder ke string kosong menonaktifkan tier disk tanpa menghapus apa pun yang sudah disimpan, dan tanpa mengubah satu byte pun output font. Itulah properti yang dijangkau ketika Anda ingin mengisolasi cache selama troubleshooting: matikan, jalankan batch yang sama, dan bandingkan PDF yang dihasilkan. Mereka harus identik, karena cache menyimpan hasil, bukan kebijakan
Apa yang dilakukan cache ketika entri rusak
Ia menghapusnya dan melakukan subset secara normal. Entri yang malformed atau terpotong ditolak sebelum subset dapat mencapai stream PDF, yang merupakan bagian desain yang paling penting: entri cache rusak yang berhasil masuk ke dokumen akan menghasilkan PDF dengan program font rusak, dan kegagalan itu akan muncul jauh dari sebabnya — di viewer, di mesin pelanggan, berminggu-minggu kemudian
Tulisan bersifat atomik, jadi pembaca tidak pernah mengamati entri setengah tertulis, dan crash di tengah penulisan meninggalkan cache konsisten alih-alih teracuni. Entri subset ringkas mempertahankan data remapping CID yang diperlukan dictionary font PDF/A, jadi subset yang di-cache masih merupakan subset yang patuh — output arsip tidak harus melewati cache untuk tetap valid
// Reset the disk tier after a font upgrade or a schema change
Pdf.ClearFontSubsetCache;
// Or move it somewhere writable and let the budget apply immediately
Pdf.SetFontSubsetCacheFolder('D:\cache\fonts');
Di mana meletakkan folder dalam deployment nyata
Tiga properti memutuskan ini: folder harus dapat ditulis oleh akun tempat layanan berjalan, harus berada di penyimpanan lokal alih-alih network share, dan tidak boleh berada di dalam direktori yang dihapus oleh langkah deployment. Cache di share mengubah setiap miss menjadi round trip dan setiap hit menjadi dua; cache di bawah folder aplikasi yang dibuat ulang oleh installer adalah cache yang dimulai dingin setelah setiap pembaruan
Untuk layanan multi-instance, beri setiap instance foldernya sendiri kecuali Anda telah mengonfirmasi penyimpanan menangani penggantian atomik konkuren seperti yang Anda harapkan. Biaya entri duplikat adalah satu pass subsetting ekstra; biaya men-debug race shared-cache adalah satu sore
Kapan harus mencari yang lain
Cache mengurangi pekerjaan berulang. Ia tidak mengurangi pekerjaan dokumen pertama, dan tidak membantu beban kerja yang himpunan glyph-nya tidak pernah berulang. Jika output Anda didominasi oleh satu font CJK yang sangat besar yang digunakan di seluruh teks yang tidak dapat diprediksi, tuasan yang lebih efektif adalah closure subsetting itu sendiri — glyph mana yang ditarik, dan mengapa — dibahas dalam catatan tentang closure subset font dan shaping glyph. Jika batch Anda lambat karena alasan yang ternyata bukan font sama sekali, panduan output laporan dengan font dan gambar menunjukkan ke mana waktu lain biasanya pergi, dan studi kasus tentang bug pengurutan subset font EndDoc adalah pengingat bahwa kebenaran subsetting dan kecepatan subsetting adalah masalah terpisah
HotPDF adalah komponen PDF VCL native untuk Delphi dan C++Builder, dan cache subset adalah bagian dari library alih-alih layanan tambahan, jadi server laporan mendapatkannya dengan menyetel satu path folder — lihat halaman komponen HotPDF untuk daftar fitur font dan kinerja lengkap