.nornir/assets/parquet_stream_reuse.svg
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1180 460" font-family="'DejaVu Sans', 'Segoe UI', sans-serif">
<defs>
<linearGradient id="board" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#0b1c2e"/>
<stop offset="1" stop-color="#06111d"/>
</linearGradient>
<linearGradient id="chip" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#14384f"/>
<stop offset="1" stop-color="#0e2a3e"/>
</linearGradient>
<linearGradient id="rail" x1="0" y1="0" x2="0" y2="1">
<stop offset="0" stop-color="#173d57"/>
<stop offset="1" stop-color="#0c2438"/>
</linearGradient>
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
<path d="M0 0 L10 5 L0 10 z" fill="#7fd0c8"/>
</marker>
</defs>
<rect x="0" y="0" width="1180" height="460" fill="url(#board)"/>
<g stroke="#143a52" stroke-width="1">
<line x1="0" y1="60" x2="1180" y2="60"/>
<line x1="0" y1="410" x2="1180" y2="410"/>
</g>
<g fill="#16415c">
<circle cx="40" cy="30" r="2"/><circle cx="1140" cy="30" r="2"/>
<circle cx="40" cy="440" r="2"/><circle cx="1140" cy="440" r="2"/>
</g>
<text x="40" y="42" fill="#8fd3ea" font-size="20" font-weight="700">skade — stream OSM/GeoParquet windows (reuse, don't re-parse)</text>
<!-- source file -->
<g>
<rect x="40" y="120" width="180" height="150" rx="10" fill="url(#rail)" stroke="#2b6a8c"/>
<text x="130" y="150" fill="#cfeafc" font-size="16" font-weight="700" text-anchor="middle">nodes.parquet</text>
<text x="130" y="176" fill="#8bb6cf" font-size="12" text-anchor="middle">OSM / GeoParquet</text>
<g fill="#0e2a3e" stroke="#2b6a8c">
<rect x="60" y="192" width="140" height="14" rx="3"/>
<rect x="60" y="212" width="140" height="14" rx="3"/>
<rect x="60" y="232" width="140" height="14" rx="3"/>
</g>
<text x="130" y="204" fill="#7fd0c8" font-size="10" text-anchor="middle">row group 0</text>
<text x="130" y="224" fill="#7fd0c8" font-size="10" text-anchor="middle">row group 1</text>
<text x="130" y="244" fill="#7fd0c8" font-size="10" text-anchor="middle">row group …</text>
</g>
<!-- ParquetWindows chip -->
<g>
<rect x="330" y="105" width="260" height="180" rx="12" fill="url(#chip)" stroke="#3aa0b8" stroke-width="2"/>
<text x="460" y="132" fill="#d7f2ff" font-size="17" font-weight="700" text-anchor="middle">skade::ParquetWindows</text>
<text x="460" y="156" fill="#9fd8e6" font-size="12" text-anchor="middle">open() — layout, no data read</text>
<line x1="352" y1="170" x2="568" y2="170" stroke="#245a72"/>
<text x="460" y="192" fill="#bfe6f2" font-size="12" text-anchor="middle">next() → one window</text>
<text x="460" y="214" fill="#7fd0c8" font-size="11" text-anchor="middle">all-core decode (gatling forkjoin)</text>
<text x="460" y="236" fill="#7fd0c8" font-size="11" text-anchor="middle">no private thread pool</text>
<text x="460" y="266" fill="#8bb6cf" font-size="11" text-anchor="middle">peak memory = ONE window</text>
</g>
<!-- gatling workers -->
<g fill="url(#rail)" stroke="#2b6a8c">
<rect x="470" y="300" width="34" height="80" rx="4"/>
<rect x="512" y="300" width="34" height="80" rx="4"/>
<rect x="554" y="300" width="34" height="80" rx="4"/>
<rect x="428" y="300" width="34" height="80" rx="4"/>
</g>
<text x="460" y="398" fill="#6fae86" font-size="11" text-anchor="middle">worker 0..threads</text>
<!-- consumer -->
<g>
<rect x="710" y="120" width="200" height="150" rx="10" fill="url(#chip)" stroke="#3aa0b8" stroke-width="2"/>
<text x="810" y="150" fill="#d7f2ff" font-size="16" font-weight="700" text-anchor="middle">korp MapLayer</text>
<text x="810" y="176" fill="#9fd8e6" font-size="12" text-anchor="middle">features(view)</text>
<text x="810" y="204" fill="#bfe6f2" font-size="11" text-anchor="middle">window → DrawFeatures</text>
<text x="810" y="224" fill="#bfe6f2" font-size="11" text-anchor="middle">for the viewport</text>
<text x="810" y="252" fill="#8bb6cf" font-size="11" text-anchor="middle">binds — never re-parses</text>
</g>
<!-- renderer -->
<g>
<rect x="990" y="150" width="150" height="90" rx="10" fill="url(#rail)" stroke="#2b6a8c"/>
<text x="1065" y="185" fill="#cfeafc" font-size="15" font-weight="700" text-anchor="middle">shared</text>
<text x="1065" y="208" fill="#cfeafc" font-size="15" font-weight="700" text-anchor="middle">renderer</text>
<text x="1065" y="228" fill="#8bb6cf" font-size="10" text-anchor="middle">source-agnostic</text>
</g>
<!-- wires -->
<g stroke="#7fd0c8" stroke-width="2.5" fill="none" marker-end="url(#arrow)">
<path d="M224 195 L326 195"/>
<path d="M594 195 L706 195"/>
<path d="M914 195 L986 195"/>
</g>
<text x="640" y="186" fill="#9fd8e6" font-size="11" text-anchor="middle">RecordBatch window</text>
</svg>