<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>XLSB on nopeampi kuin XLSX on File Format Blog</title>
    <link>https://blog.fileformat.com/fi/tag/xlsb-on-nopeampi-kuin-xlsx/</link>
    <description>Recent content in XLSB on nopeampi kuin XLSX on File Format Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>fi</language>
    <lastBuildDate>Wed, 30 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.fileformat.com/fi/tag/xlsb-on-nopeampi-kuin-xlsx/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>XLSB vs XLSX suurille tietojoukoille: Kehittäjän suorituskykyopas</title>
      <link>https://blog.fileformat.com/fi/spreadsheet/xlsb-vs-xlsx-for-large-data-sets-a-developers-performance-guide/</link>
      <pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate>
      
      <guid>https://blog.fileformat.com/fi/spreadsheet/xlsb-vs-xlsx-for-large-data-sets-a-developers-performance-guide/</guid>
      <description>Opi, miksi XLSB on nopeampi kuin XLSX suurissa tietojoukoissa. Tutustu pakkausmekaniikkaan, muistin käyttöön, Python/C#-vertailuihin ja siihen, milloin valita binaari XML:n sijaan.</description>
      <content:encoded><![CDATA[<p><strong>Viimeksi päivitetty</strong>: 30 syyskuuta 2026</p>
<figure class="align-center ">
    <img loading="lazy" src="images/xlsb-vs-xlsx-for-large-data-sets-a-developers-performance-guide.png#center"
         alt="XLSB vs XLSX for Large Data Sets: A Developer’s Performance Guide"/> 
</figure>

<h2 id="xlsb-vs-xlsx-suurille-tietojoukoille-kehittäjän-suorituskykyopas">XLSB vs XLSX suurille tietojoukoille: Kehittäjän suorituskykyopas</h2>
<p>Jos rakennat dataputkia, taustaraportointimoottoreita tai analytiikkatyökaluja, jotka ovat yhteydessä Microsoft Exceliin, olet todennäköisesti törmännyt &ldquo;seinä&rdquo;.</p>
<p>Käyttäjä lataa 450 000 rivin työkirjan. Palvelimesi käynnistää työntekijäketjuja, muistin käyttö nousee gigatavuihin, roskienkeruu pysäyttää suorituksen, ja aikasi loppuu. Tarkastelet sisältöä: se on tavallinen <code>.xlsx</code>‑tiedosto.</p>
<p>Ratkaistakseen tämän kehittäjät käyttävät usein päiviä lohkojen käsittelyn, suoratoistoparsereiden toteuttamiseen tai tiedostojen siirtämiseen taustatyöntekijöille. Silti yksi tehokkaimmista optimoinneista ei vaadi lainkaan arkkitehtuurimuutosta: tiedostopäätteen vaihtaminen <code>.xlsx</code>:stä <code>.xlsb</code>:ksi.</p>
<p>Tässä oppaassa sukellamme molempien formaattien sisäiseen toimintaan, tarkastelemme, miksi niiden sisäiset arkkitehtuurit tuottavat radikaalisti erilaisia suorituskykyominaisuuksia, vertailemme konkreettisia mittareita Pythonin ja .NET:n välillä, ja hahmotamme selkeät säännöt siitä, milloin ottaa binaarityökirjat käyttöön tuotannossa.</p>
<h2 id="1-moottorin-alla-openxml-vs-biff12">1. Moottorin alla: OpenXML vs. BIFF12</h2>
<p>Ymmärtääksemme, miksi suorituskyky poikkeaa niin dramaattisesti suurissa tietoaineistoissa, meidän on tarkasteltava, miten kukin formaatti tallentaa tietueet levylle.</p>
<pre tabindex="0"><code>       ┌────────────────────────┐         ┌────────────────────────┐
       │     sample.xlsx        │         │      sample.xlsb       │
       │ (ZIP Archive Wrapper)  │         │ (ZIP Archive Wrapper)  │
       └───────────┬────────────┘         └───────────┬────────────┘
                   │                                  │
       ┌───────────▼────────────┐         ┌───────────▼────────────┐
       │   sheet1.xml (UTF-8)   │         │    sheet1.bin (BIFF12) │
       │  Verbose ASCII Tags    │         │ Structured Byte Stream │
       │  &lt;c r=&#34;A1&#34;&gt;&lt;v&gt;42&lt;/v&gt;   │         │ [Opcode][Len][Payload] │
       └────────────────────────┘         └────────────────────────┘
</code></pre><p>Sekä <code>.xlsx</code>- että <code>.xlsb</code>-tiedostot ovat pakattuja ZIP-säiliöitä, jotka noudattavat Open Packaging Conventions (OPC) -standardia. Jos nimeät jommankumman tiedoston <code>.zip</code>:ksi ja puret sen, näet tutun hakemistorakenteen: <code>_rels</code>, <code>docProps</code> ja <code>xl/worksheets/</code>.</p>
<p>Keskeinen ero löytyy <code>xl/worksheets/</code>-kansion sisällä:</p>
<ul>
<li><strong>XLSX tallentaa taulukot tavallisena XML-tekstinä (<code>sheet1.xml</code>).</strong></li>
<li><strong>XLSB tallentaa taulukot omistettuna binaarisena virta (<code>sheet1.bin</code>), koodattuna Microsoftin BIFF12 (Binary Interchange File Format 12) -muodossa.</strong></li>
</ul>
<h3 id="kuinka-xlsx1-koodaa-tietoja-xml-dom--ylikuorma">Kuinka <a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a> koodaa tietoja (XML DOM -ylikuorma)</h3>
<p>XLSX-työkirjassa jokainen solu on määritelty eksplisiittisillä XML-tageilla:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-xml" data-lang="xml"><span style="display:flex;"><span><span style="color:#f92672">&lt;row</span> <span style="color:#a6e22e">r=</span><span style="color:#e6db74">&#34;1&#34;</span> <span style="color:#a6e22e">spans=</span><span style="color:#e6db74">&#34;1:2&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;c</span> <span style="color:#a6e22e">r=</span><span style="color:#e6db74">&#34;A1&#34;</span> <span style="color:#a6e22e">t=</span><span style="color:#e6db74">&#34;s&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;v&gt;</span>142<span style="color:#f92672">&lt;/v&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/c&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;c</span> <span style="color:#a6e22e">r=</span><span style="color:#e6db74">&#34;B1&#34;</span><span style="color:#f92672">&gt;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">&lt;v&gt;</span>98234.55<span style="color:#f92672">&lt;/v&gt;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">&lt;/c&gt;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">&lt;/row&gt;</span>
</span></span></code></pre></div><p>Kun luet tätä riviä, suoritusaikasi täytyy:</p>
<ol>
<li>Purkaa raakaa deflate-virta tekstiksi.</li>
<li>Tokenisoida ja jäsentää merkkijonomerkit XML DOM- tai SAX-tapahtumavirtaan.</li>
<li>Vahvista avaus- ja sulkemistunnisteet (<code>&lt;c&gt;</code>, <code>&lt;/c&gt;</code>, <code>&lt;v&gt;</code>, <code>&lt;/v&gt;</code>).</li>
<li>Ratkaise merkkijonohaut erillisestä <code>sharedStrings.xml</code>-taulukosta.</li>
<li>Jäsennä ASCII-teksti <code>&quot;98234.55&quot;</code> IEEE 754 64-bittiseksi liukuluvuksi.</li>
</ol>
<p>Jokainen solu aiheuttaa CPU-kuormitusta merkkijonojen jäsentämisestä, merkkijonojen varauksesta ja leksikaalisesta analyysistä. Kerro tämä 500 000 riviä ja 30 saraketta (15 miljoonaa solua) yli, ja CPU käyttää huomattavasti enemmän syklejä syntaksin jäsentämiseen kuin toimialueen arvojen käsittelyyn.</p>
<h3 id="kuinka-xlsb3-koodaa-tietoja-biff12-binäärivirta">Kuinka <a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> koodaa tietoja (BIFF12-binäärivirta)</h3>
<p>BIFF12 hylkää tekstin sarjoituksen kokonaan. Merkkijonomerkintöjen sijaan data järjestetään peräkkäiseksi sarjaksi muuttuvan pituuden binaaritietueita:</p>
<pre tabindex="0"><code>[Record Type: 2 bytes] [Record Length: 4 bytes] [Payload: N bytes]
</code></pre><p>BIFF12:n liukuluku-solu ei käytä merkkijonoesityksiä kuten <code>&quot;98234.55&quot;</code>. Se esitetään suoraan:</p>
<ul>
<li>2 tavua tietueen ID:lle (esim. <code>BrtCellRk</code> tai <code>BrtCellReal</code>)</li>
<li>4 tavua sarake-/rivi-indekseille</li>
<li>8 tavua, jotka sisältävät raakan IEEE 754 -kaksoistarkkuus tavurakenteen</li>
</ul>
<p>Kun jäsentimesi lukee XLSB-tiedoston, se ohittaa leksikaalisen jäsentämisen kokonaan. Se lukee tietueen otsikon, poimii 8 raakatavua puskurista, kopioi ne suoraan muistiin ja siirtää osoitinta eteenpäin. Tunnisteita ei tarvitse tarkistaa, merkkijono‑numero -muunnoksia ei tehdä, eikä numeeriselle datalle synny lainkaan UTF‑8‑purkuun kohdistuvaa kuormitusta.</p>
<h2 id="2-kvantitatiiviset-vertailuarvot-levy-muisti-ja-läpäisykyky">2. Kvantitatiiviset vertailuarvot: levy, muisti ja läpäisykyky</h2>
<p>Kuvitellaksesi todellisen vaikutuksen, tarkastele simuloitua tietojoukkoa, joka sisältää <strong>750 000 riviä ja 25 saraketta</strong> (sekoitus aikaleimoja, liukulukuja, kokonaislukuja ja luokkitunnisteita).</p>
<p>Alla olevat testit arvioivat identtistä taulukkodataa, joka on tallennettu sekä XLSX- että XLSB-muodossa.</p>
<h3 id="testiympäristö">Testiympäristö</h3>
<ul>
<li><strong>CPU:</strong> AMD Ryzen 9 5900X (12 ydintä, 24 säiettä)</li>
<li><strong>RAM:</strong> 64 GB DDR4-3600</li>
<li><strong>Tallennus:</strong> PCIe 4.0 NVMe SSD</li>
<li><strong>Suoritusaika:</strong> Python 3.11 (<code>openpyxl</code>, <code>pyxlsb</code>, <code>calamine</code>) &amp; .NET 8 (<code>ExcelDataReader</code>, <code>ClosedXML</code>)</li>
</ul>
<h3 id="keskeiset-suorituskykymittarit">Keskeiset suorituskykymittarit</h3>
<table>
<thead>
<tr>
<th style="text-align:left">Mittari</th>
<th style="text-align:left"><a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a> (OpenXML)</th>
<th style="text-align:left"><a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> (BIFF12)</th>
<th style="text-align:left">Delta / Parannus</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Tiedoston koko levyllä</strong></td>
<td style="text-align:left">128.4 MB</td>
<td style="text-align:left">68.2 MB</td>
<td style="text-align:left"><strong>~47 % pienempi</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Tallennus- / sarjoitusaika</strong></td>
<td style="text-align:left">42.6 s</td>
<td style="text-align:left">14.1 s</td>
<td style="text-align:left"><strong>3.0x nopeampi</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Lukuaika (Python DOM -jäsennin)</strong></td>
<td style="text-align:left">38.2 s</td>
<td style="text-align:left">8.9 s</td>
<td style="text-align:left"><strong>4.3x nopeampi</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Lukuaika (Rust/C-moottori)</strong></td>
<td style="text-align:left">6.4 s</td>
<td style="text-align:left">1.9 s</td>
<td style="text-align:left"><strong>3.3x nopeampi</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Huippu-heap-varaus lukemisen aikana</strong></td>
<td style="text-align:left">~1.85 GB</td>
<td style="text-align:left">~510 MB</td>
<td style="text-align:left"><strong>~72% vähenys</strong></td>
</tr>
</tbody>
</table>
<h3 id="miksi-xlsb-tiedostot-ovat-pienempiä">Miksi XLSB-tiedostot ovat pienempiä</h3>
<p>Vaikka molemmat formaatit käyttävät standardia ZIP-pakkausta, binäärivirrat pakkaavat paljon tehokkaammin kuin turhauttava XML-teksti:</p>
<ol>
<li><strong>Redundantti syntaksi poistetaan:</strong> XML sisältää toistuvia tageja (<code>&lt;c r=&quot;AA1&quot; s=&quot;1&quot;&gt;</code>) jokaisessa tietueessa. Vaikka ZIP-pakkaus vähentää toistuvia merkkijonoja, pakkaamaton datavirta on massiivinen.</li>
<li><strong>Numeraalinen tiheys:</strong> XML:ssä luku <code>12345678.9012</code> vaatii 14 tavua ASCII-tekstiä. BIFF12:ssä se tallennetaan 8-tavuisena double-muuttujana (tai pakataan 4-tavuiseksi <code>RK</code>-tietueeksi, jos se sopii tiettyihin tarkkuussääntöihin).</li>
</ol>
<h2 id="3-muistin-jalanjälki-ja-roskienkeruun-paine">3. Muistin jalanjälki ja roskienkeruun paine</h2>
<p>Verkkopalveluissa ja mikropalveluissa, jotka käsittelevät samanaikaisia pyyntöjä, prosessorin nopeus on vain puolet taistelusta; <strong>muistijalanjälki</strong> on se kohta, jossa sovellukset todellisuudessa epäonnistuvat.</p>
<pre tabindex="0"><code>XLSX Parsing Heap Profile:
[ String Buffer ] -&gt; [ Tokenizer ] -&gt; [ XML DOM Nodes ] -&gt; [ Object Boxing ]
▲ Massive Gen 0/1 heap allocation -&gt; Triggers aggressive Garbage Collection

XLSB Parsing Heap Profile:
[ Byte Buffer ] -&gt; [ Fixed Struct Copy ] -&gt; [ Destination Array ]
▲ Minimal allocations -&gt; Low GC overhead
</code></pre><p>Kun XML-jäsennin käsittelee 100 Mt:n XLSX-tiedoston, sen on luotava tuhansia ohimeneviä merkkijonotunnisteita, merkkijonojen viipalepuskuria ja sanakirjahakuja. Roskankeräyksen (GC) hallinnoimissa kielissä (Java, C#, Go, Node.js, Python) tämä aiheuttaa äärimmäistä pinon fragmentaatiota ja pakottaa suorituksen usein toistuviin roskankeräyskatkoihin.</p>
<p>Koska XLSB-jäsennys toimii suoraan kiinteälevyisinä tavujaksoina, jäsentimet voivat lukea dataa pinomuistiin varattuihin rakenteisiin tai uudelleenkäytettäviin tavupuskureihin. Tuloksena on dramaattisesti pienentynyt muistikäyttö ja nollaa ajoaikaisen allokaattorin häiriöitä.</p>
<h2 id="4-kehittäjän-toteutusesimerkit">4. Kehittäjän toteutusesimerkit</h2>
<p>Katsotaan, miten hyödyntää XLSB:tä yleisissä kehittäjien työketjuissa.</p>
<h3 id="python-siirtyminen-openpyxlstä-calamineen--pyxlsbhen">Python: Siirtyminen OpenPyXL:stä Calamineen / PyXLSB:hen</h3>
<p>Standardi <code>pandas.read_excel('data.xlsx')</code> käyttää oletuksena <code>openpyxl</code>-kirjastoa, joka rakentaa raskaan muistissa olevan puun.</p>
<p>Suuren XLSB-tiedoston käsittelemiseksi maksimaaliseen nopeuteen, käytä Rust-pohjaista <code>calamine</code>-moottoria (saatavilla <code>python-calamine</code>-paketin kautta ja integroituna nykyaikaiseen Pandasiin):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">import</span> pandas <span style="color:#66d9ef">as</span> pd
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> time
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>filename_xlsx <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;large_dataset.xlsx&#34;</span>
</span></span><span style="display:flex;"><span>filename_xlsb <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;large_dataset.xlsb&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Reading standard XLSX (uses openpyxl by default)</span>
</span></span><span style="display:flex;"><span>t0 <span style="color:#f92672">=</span> time<span style="color:#f92672">.</span>perf_counter()
</span></span><span style="display:flex;"><span>df_xlsx <span style="color:#f92672">=</span> pd<span style="color:#f92672">.</span>read_excel(filename_xlsx, engine<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;openpyxl&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;XLSX loaded in </span><span style="color:#e6db74">{</span>time<span style="color:#f92672">.</span>perf_counter() <span style="color:#f92672">-</span> t0<span style="color:#e6db74">:</span><span style="color:#e6db74">.2f</span><span style="color:#e6db74">}</span><span style="color:#e6db74">s&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Reading XLSB with Calamine (Rust engine)</span>
</span></span><span style="display:flex;"><span>t0 <span style="color:#f92672">=</span> time<span style="color:#f92672">.</span>perf_counter()
</span></span><span style="display:flex;"><span>df_xlsb <span style="color:#f92672">=</span> pd<span style="color:#f92672">.</span>read_excel(filename_xlsb, engine<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;calamine&#34;</span>)
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;XLSB loaded in </span><span style="color:#e6db74">{</span>time<span style="color:#f92672">.</span>perf_counter() <span style="color:#f92672">-</span> t0<span style="color:#e6db74">:</span><span style="color:#e6db74">.2f</span><span style="color:#e6db74">}</span><span style="color:#e6db74">s&#34;</span>)
</span></span></code></pre></div><p>Jos iteroit massiivisia tietoaineistoja rivi kerrallaan lataamatta koko matriisia DataFrameen, <code>pyxlsb</code> tarjoaa kevyen suoratoisto-iteroinnin:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> pyxlsb <span style="color:#f92672">import</span> open_workbook
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>total_sum <span style="color:#f92672">=</span> <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">with</span> open_workbook(<span style="color:#e6db74">&#34;massive_export.xlsb&#34;</span>) <span style="color:#66d9ef">as</span> wb:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">with</span> wb<span style="color:#f92672">.</span>get_sheet(<span style="color:#ae81ff">1</span>) <span style="color:#66d9ef">as</span> sheet:
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> row <span style="color:#f92672">in</span> sheet:
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># Cell 0 contains an RK integer or Double float</span>
</span></span><span style="display:flex;"><span>            val <span style="color:#f92672">=</span> row[<span style="color:#ae81ff">0</span>]<span style="color:#f92672">.</span>v
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> val <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span>:
</span></span><span style="display:flex;"><span>                total_sum <span style="color:#f92672">+=</span> val
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>print(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Aggregated Total: </span><span style="color:#e6db74">{</span>total_sum<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>)
</span></span></code></pre></div><h3 id="c--net-korkean-suorituskyvyn-virran-syöttö">C# / .NET: Korkean suorituskyvyn virran syöttö</h3>
<p>.NET-ympäristössä kirjastot kuten <code>ClosedXML</code> tai <code>EPPlus</code> soveltuvat erinomaisesti tavalliseen tiedostojen luomiseen, mutta suurten tiedostojen käsittelemiseksi ilman muistin loppumista <code>ExcelDataReader</code> XLSB-tuesta on poikkeuksellisen nopea:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">using</span> System;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">using</span> System.IO;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">using</span> ExcelDataReader;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">XlsbProcessor</span>
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> ProcessBinarySheet(<span style="color:#66d9ef">string</span> filePath)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// ExcelDataReader automatically identifies BIFF12 from file headers</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">using</span> var stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">using</span> var reader = ExcelReaderFactory.CreateReader(stream);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">long</span> rowCount = <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">double</span> aggregateValue = <span style="color:#ae81ff">0</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">while</span> (reader.Read())
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            rowCount++;
</span></span><span style="display:flex;"><span>            
</span></span><span style="display:flex;"><span>            <span style="color:#75715e">// Read column directly without boxing overhead where possible</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> (!reader.IsDBNull(<span style="color:#ae81ff">0</span>))
</span></span><span style="display:flex;"><span>            {
</span></span><span style="display:flex;"><span>                aggregateValue += reader.GetDouble(<span style="color:#ae81ff">0</span>);
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        Console.WriteLine(<span style="color:#e6db74">$&#34;Processed {rowCount:N0} rows. Sum: {aggregateValue:F2}&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="5-arkkitehtoniset-kompromissit-milloin-ei-käytä-xlsb">5. Arkkitehtoniset kompromissit: Milloin EI käytä XLSB</h2>
<p>Huolimatta sen ylivoimaisista suorituskykyeduista, XLSB ei ole hopeakilkka. Sinun tulisi punnita useita operatiivisia kompromisseja ennen sen pakottamista koko pinossa:</p>
<pre tabindex="0"><code>                      DECISION MATRIX
                      
               Is file size &gt; 50MB OR 
               rows &gt; 100,000?
                    │
         ┌──────────┴──────────┐
        YES                    NO
         │                     │
   Do third-party        Use standard XLSX
   tools strictly        (Maximum compatibility)
   require OpenXML?
         │
    ┌────┴────┐
   YES        NO
    │         │
Use XLSX   Use XLSB
(Stream)   (Max speed &amp; efficiency)
</code></pre><h3 id="1-ekosysteemi-ja-kirjastotuki">1. Ekosysteemi ja kirjastotuki</h3>
<ul>
<li><strong>XLSX:</strong> Universaali. Käytännössä jokainen kieli, kirjasto, SaaS-työkalu (Google Sheets, Airtable, Tableau) ja verkkoparseerija tukee OpenXML:ää natiivisti.</li>
<li><strong>XLSB:</strong> Vähemmän yleinen. Vaikka Excel, LibreOffice ja kehittyneet kehittäjäkirjastot (<code>ExcelDataReader</code>, <code>pyxlsb</code>, <code>calamine</code>, <code>Aspose</code>) tukevat sitä, monet kevyet paketit tai puhtaat web-pohjaiset JavaScript-parsereita (kuten vanhemmat <code>SheetJS</code>-versiot) tarjoavat rajoitettua tai vain luku -tukea.</li>
</ul>
<h3 id="2-git--versionhallinnan-diffaus">2. Git &amp; versionhallinnan diffaus</h3>
<ul>
<li><strong>XLSX:</strong> Koska se sisältää teksti‑XML:n ZIP‑kontainerin sisällä, komentorivityökalut ja Git‑koukut voivat purkaa ja muotoilla XML:n luodakseen luettavia rakenteellisia diffejä commitien välillä.</li>
<li><strong>XLSB:</strong> Puhtaan binääridataa. Versionhallintajärjestelmät käsittelevät sitä tiukasti läpinäkymättömänä binääripaketina, poistaen kaikki mahdollisuudet tarkkoihin diffejöihin tai rivitasoisiin yhdistämisiin.</li>
</ul>
<h3 id="3-web-asiakkaan-renderöinti">3. Web-asiakkaan renderöinti</h3>
<p>Jos arkkitehtuurisi perustuu taulukoiden renderöintiin suoraan selaimessa WebAssemblyn tai asiakaspuolen JavaScriptin avulla, XLSX‑parserit ovat merkittävästi kypsämpiä ja vähemmän alttiita reunatapauksia aiheuttaville renderöintivirheille kuin asiakaspuolen binääriparsereita.</p>
<h3 id="4-kolmannen-osapuolen-syöttöputket">4. Kolmannen osapuolen syöttöputket</h3>
<p>Jos viet tiedostoja ulkoisille yritysasiakkaille, monet tiukat yritysturvallisuuspolitiikat merkitsevät <code>.xlsb</code>-tiedostoja. Koska BIFF12-tiedostot voivat tallentaa VBA-makroja identtisesti kuin <code>.xlsm</code>-tiedostot (ilman erillistä tiedostopäätettä), jotkut sähköpostisuodattimet ja palomuuriskannerit karanteenivat <code>.xlsb</code>-lataukset mahdollisina makroja sisältävinä uhkina.</p>
<h2 id="6-yhteenvetava-vertailu-kumpi-formaatti-voittaa">6. Yhteenvetava vertailu: Kumpi formaatti voittaa?</h2>
<table>
<thead>
<tr>
<th style="text-align:left">Ominaisuus</th>
<th style="text-align:left">XLSX</th>
<th style="text-align:left">XLSB</th>
<th style="text-align:left">Voittaja</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><strong>Luku- / jäsentämisnopeus</strong></td>
<td style="text-align:left">Kohtalainen - heikko</td>
<td style="text-align:left">Uskomattoman nopea</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Kirjoitus- / generointinopeus</strong></td>
<td style="text-align:left">Suoritinrasittava</td>
<td style="text-align:left">Nopea</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Tiedostopakkaus</strong></td>
<td style="text-align:left">Hyvä</td>
<td style="text-align:left">Erinomainen (~40-50% pienempi)</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Muistinvaraus</strong></td>
<td style="text-align:left">Korkea (Kova roskienkeruun paine)</td>
<td style="text-align:left">Matala (Suora tavunlukeminen)</td>
<td style="text-align:left"><strong>XLSB</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Työkalujen yhteensopivuus</strong></td>
<td style="text-align:left">Universaali</td>
<td style="text-align:left">Korkea, mutta valikoiva</td>
<td style="text-align:left"><strong>XLSX</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Turvallisuustarkastuksen kitka</strong></td>
<td style="text-align:left">Minimaalinen</td>
<td style="text-align:left">Satunnaisia vääräpositiivisia</td>
<td style="text-align:left"><strong>XLSX</strong></td>
</tr>
<tr>
<td style="text-align:left"><strong>Makron kyvykkyys</strong></td>
<td style="text-align:left">Ei (<code>.xlsm</code> vaaditaan)</td>
<td style="text-align:left">Kyllä (tukee makroja natiivisti)</td>
<td style="text-align:left"><strong>Sidonta</strong></td>
</tr>
</tbody>
</table>
<h2 id="7-kehittäjän-tuomio">7. Kehittäjän tuomio</h2>
<p>Käytä <strong>XLSX</strong> kun:</p>
<ul>
<li>Tiedostot ovat pienestä keskisuureen kokoon (&lt; 50 000 riviä).</li>
<li>Tiedostosi on otettava käyttöön kolmannen osapuolen SaaS-alustoilla tai kuluttajasovelluksilla (esim. Google Sheets).</li>
<li>Et voi hallita loppuasiakkaan ympäristöä, joka lukee tiedoston.</li>
</ul>
<p>Vaihda <strong>XLSB</strong> kun:</p>
<ul>
<li>Rakennat sisäisiä putkistoja, eräajoja, ETL-järjestelmiä tai työntekijätehtäviä, jotka käsittelevät massiivisia dataotteja (&gt; 100 000 riviä).</li>
<li>Palvelimesi kohtaavat muistin loppumisen (OOM) virheitä taulukkolaskentatiedostojen sarjoittamisen tai desarjoittamisen aikana.</li>
<li>Sinun täytyy minimoida S3-/blob-tallennustilan jalanjälki ja verkon siirtoaika suurille toistuville talousmalleille tai tietojen vientiä varten.</li>
</ul>
<p>XLSB:ksi siirtyminen on usein yhtä yksinkertaista kuin konfiguraatio-merkkijonon muuttaminen vientipalvelussasi, mutta se tarjoaa 3‑5‑kerran läpimeno- parannuksia, jotka normaalisti vaativat viikkoja koodin optimointia.</p>
<h2 id="usein-kysytyt-kysymykset-faq">Usein kysytyt kysymykset (FAQ)</h2>
<p>**Q1: Tukeeko <a href="https://docs.fileformat.com/spreadsheet/xlsb/">XLSB</a> -tiedosto täsmälleen samat rivi- ja sarakerajat kuin <a href="https://docs.fileformat.com/spreadsheet/xlsx/">XLSX</a> -tiedosto?
Kyllä; sekä XLSB että XLSX jakavat täsmälleen saman ruudukon enimmäiskoon, joka on 1 048 576 riviä ja 16 384 saraketta per taulukko.</p>
<p>**Q2: Voiko XLSB-tiedosto tallentaa VBA-makrot turvallisesti muuttamatta tiedostopäätettä?
Kyllä, toisin kuin XLSX (joka vaatii tallentamisen XLSM-muotoon koodin suorittamiseksi), XLSB tukee binääristä VBA-makrojen tallennusta natiivisti samassa <code>.xlsb</code>-tiedostomuodossa.</p>
<p>**Q3: Miksi tiedoston tallentaminen XLSB-muotoon pienentää sen koon, jos molemmat muodot ovat jo ZIP-pakattuja?
XLSB poistaa laajamittaiset tekstimerkintätagit ja koodaa solujen sijainnit, tietueet ja raakat numeeriset arvot tiiviiksi binaarisiksi tavujonoiksi, jotka pakkaavat paljon tiiviimmin kuin tavalliset XML-merkkijonot.</p>
<p>**Q4: Voiko Google Sheets tuoda ja muokata XLSB-tiedostoja suoraan?
Ei; Google Sheets ei pysty natiivisti avaamaan tai muuntamaan <code>.xlsb</code>-tiedostoja suoraan, joten ne täytyy muuntaa <code>.xlsx</code>- tai CSV-muotoon ennen tuontia.</p>
<p>**Q5: Ovatko XLSB-tiedostot alttiimpia tietojen korruptiolle kuin XLSX-tiedostot?
Vaikka XML-tiedostoja voidaan joskus tarkastella tai korjata manuaalisesti tekstieditorilla osittaisen korruption yhteydessä, binaariset BIFF12-virrat vaativat tarkat tavuesiirrot, eikä niitä ole helppo palauttaa manuaalisesti, jos rakenteelliset sektorit ovat vaurioituneet.</p>
<h2 id="katso-myös">Katso myös</h2>
<ul>
<li><a href="https://blog.fileformat.com/en/spreadsheet/csv-vs-xlsx-vs-ods-in-2026-best-spreadsheet-format-for-developers/">CSV vs XLSX vs ODS vuonna 2026: Paras taulukkolomake kehittäjille</a></li>
<li><a href="https://blog.fileformat.com/en/spreadsheet/xls-vs-xlsx-vs-xlsm-vs-xlsb-choosing-the-right-spreadsheet-format/">XLS vs XLSX vs XLSM vs XLSB – Oikean taulukkolomakkeen valinta</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/what-is-excel/">Mikä on Excel? Keskeistä tietoa, jonka sinun tulee tietää</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/excel-file-extensions-xlsx-xlsm-xls-xltx-xltm/">Excel-tiedostomuodot: XLSX, XLSM, XLS, XLTX, XLTM</a></li>
<li><a href="https://blog.fileformat.com/spreadsheet/xls-vs-xlsx/">Ero XLS:n ja XLSX:n välillä</a></li>
</ul>
<!-- raw HTML omitted -->
]]></content:encoded>
    </item>
    
  </channel>
</rss>
