<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: y4u</title>
    <description>The latest articles on DEV Community by y4u (@_156a59a8566fe532e165).</description>
    <link>https://dev.to/_156a59a8566fe532e165</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1466730%2F7b49a169-2811-48c7-98a1-214aab4983cf.jpeg</url>
      <title>DEV Community: y4u</title>
      <link>https://dev.to/_156a59a8566fe532e165</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/_156a59a8566fe532e165"/>
    <language>en</language>
    <item>
      <title>My Fanless Mac Skewed My Benchmark by 54% — Thermal Throttling and Round-Robin Measurement</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Fri, 14 Aug 2026 13:41:36 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/my-fanless-mac-skewed-my-benchmark-by-54-thermal-throttling-and-round-robin-measurement-b45</link>
      <guid>https://dev.to/_156a59a8566fe532e165/my-fanless-mac-skewed-my-benchmark-by-54-thermal-throttling-and-round-robin-measurement-b45</guid>
      <description>&lt;p&gt;While measuring how my search engine scales with thread count (results in the &lt;a href="https://dev.to/_156a59a8566fe532e165/how-many-search-threads-is-the-right-number-i-measured-089-billion-lines-at-1-16-threads-47ni"&gt;companion article&lt;/a&gt;, I threw away my entire first data set. Here's why — and if you ever benchmark anything on a fanless laptop, this is not someone else's problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first data set was clean, and wrong
&lt;/h2&gt;

&lt;p&gt;I measured 1 through 10 threads, in order. The curve looked beautiful, including a shiny record: "11 threads, fastest at 5.2 seconds." Right before writing the article, I re-ran the same conditions as a sanity check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The same conditions came back up to 54% different.&lt;/strong&gt; 4 threads: 11.0s became 9.0s. 11 threads: 5.2s became 8.0s. The record run did not reproduce.&lt;/p&gt;

&lt;p&gt;No rogue background process. The culprit was the chassis.&lt;/p&gt;

&lt;h2&gt;
  
  
  The culprit: thermal history on a fanless machine
&lt;/h2&gt;

&lt;p&gt;The test machine is a MacBook Air (Apple M4) — &lt;strong&gt;fanless&lt;/strong&gt;. Under sustained load it heats up and thermal-throttles. Which means: &lt;strong&gt;every measurement depends on what you measured just before it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The nasty part is that this is not random noise — it's a &lt;strong&gt;systematic error&lt;/strong&gt;. Sweep 1→2→...→10 in order and the later thread counts always run on a hotter chip. The high-thread results are penalized, consistently, in the same direction. Averaging repeated sweeps doesn't remove it, because the bias repeats too. That "fastest 5.2s at 11 threads"? A single lucky run on a cold chip. The cleaner the graph, the more suspicious you should be.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: round-robin
&lt;/h2&gt;

&lt;p&gt;Stop measuring each thread count in a block. Instead: &lt;strong&gt;sweep 1-16 threads once, repeat the whole sweep for 4 rounds, and take the per-thread-count median across rounds.&lt;/strong&gt; Every thread count now experiences cold and hot states equally; the thermal history no longer piles onto specific configurations.&lt;/p&gt;

&lt;p&gt;The corrected protocol (128 measurements) produced the companion article's conclusion: a plateau at 8 threads, 3.0x. The 5.2s ghost vanished; 7.4s became a reproducible floor.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do you know the fix worked?
&lt;/h2&gt;

&lt;p&gt;Claiming "the new numbers are right" needs evidence. Mine: &lt;strong&gt;two search patterns with hit counts differing by more than an order of magnitude (10,967 vs. 722 hits) produced nearly identical scaling curves.&lt;/strong&gt; If heat or any other disturbance were still leaking in, there's no reason two independent series would line up that well.&lt;/p&gt;

&lt;p&gt;I kept the first CSV for reference but decided it never appears in an article. Publish a retracted number "for reference" and someday someone will cite it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;On a fanless machine, measurement order leaks into results.&lt;/strong&gt; A sequential sweep systematically penalizes the later configurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Distrust beautiful single records.&lt;/strong&gt; One cold run masquerades as a best case&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Round-robin + median distributes cold and hot fairly&lt;/strong&gt; across all configurations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validate with independent series, not repetition.&lt;/strong&gt; Re-running the same biased protocol reproduces the same bias&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The benchmark's enemy wasn't a rival product. It was my own chassis.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From the developer&lt;/strong&gt;: a list of my apps, Kindle books and open-source projects is on &lt;a href="https://github.com/amru195704" rel="noopener noreferrer"&gt;GitHub: amru195704&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A note&lt;/strong&gt;&lt;br&gt;
The information in this article is provided for reference purposes only, and its accuracy or completeness is not guaranteed. If you notice any errors or inaccuracies, please let us know in the comments and we will review and correct them.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>hardware</category>
      <category>performance</category>
      <category>programming</category>
    </item>
    <item>
      <title>How Many Search Threads Is the Right Number? I Measured 0.89 Billion Lines at 1-16 Threads</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Fri, 14 Aug 2026 13:30:46 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/how-many-search-threads-is-the-right-number-i-measured-089-billion-lines-at-1-16-threads-47ni</link>
      <guid>https://dev.to/_156a59a8566fe532e165/how-many-search-threads-is-the-right-number-i-measured-089-billion-lines-at-1-16-threads-47ni</guid>
      <description>&lt;p&gt;When you parallelize a text search, how many threads should you use? "One per core," "cores x 2," "physical cores only" — the folklore varies. The only number I trust is one measured on my own app, against real data.&lt;/p&gt;

&lt;p&gt;I benchmarked the search engine of &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;UwView Pro&lt;/a&gt;, my large-text viewer, against &lt;strong&gt;0.89 billion lines of real data at 1-16 threads&lt;/strong&gt;. The headline: &lt;strong&gt;it plateaus at 8 threads (3.0x over single-threaded)&lt;/strong&gt; — on a 10-core machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  The full methodology
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Machine: MacBook Air (Apple M4 / 10 cores = 4 performance + 6 efficiency / 32GB RAM / on AC power)&lt;/li&gt;
&lt;li&gt;Data: OpenStreetMap Japan &lt;code&gt;japan-latest.osm&lt;/code&gt; (48GB original, 0.89B lines) as a 5.3GB compressed &lt;code&gt;.uwvz&lt;/code&gt; cache&lt;/li&gt;
&lt;li&gt;Target: the search engine run standalone (&lt;code&gt;search-standalone&lt;/code&gt;) — no UI, no file-open cost&lt;/li&gt;
&lt;li&gt;Condition: warm cache. &lt;strong&gt;Cold-cache numbers were not measured this time&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Protocol: &lt;strong&gt;a 1-to-16-thread sweep repeated for 4 rounds (round-robin), taking the per-thread-count median across rounds&lt;/strong&gt; — 128 measurements total&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Why round-robin instead of "measure 1, then 2, then 3..."? The M4 Air is fanless. Under sustained load it thermal-throttles, so &lt;strong&gt;measurement order leaks into the results as a systematic error&lt;/strong&gt;: a sequential sweep measures the later thread counts on a hotter chip. That story deserved its own post (see the companion article); every number below is from the corrected protocol.&lt;/p&gt;

&lt;p&gt;The harness is a single shell script driving the engine and dumping CSV; a Python script draws the plots.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Two search patterns with very different hit counts:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Threads&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;5&lt;/th&gt;
&lt;th&gt;6&lt;/th&gt;
&lt;th&gt;7&lt;/th&gt;
&lt;th&gt;8&lt;/th&gt;
&lt;th&gt;9&lt;/th&gt;
&lt;th&gt;10&lt;/th&gt;
&lt;th&gt;11&lt;/th&gt;
&lt;th&gt;12&lt;/th&gt;
&lt;th&gt;13&lt;/th&gt;
&lt;th&gt;14&lt;/th&gt;
&lt;th&gt;15&lt;/th&gt;
&lt;th&gt;16&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Tokyo&lt;/code&gt; (10,967 hits)&lt;/td&gt;
&lt;td&gt;22.2&lt;/td&gt;
&lt;td&gt;13.8&lt;/td&gt;
&lt;td&gt;11.5&lt;/td&gt;
&lt;td&gt;10.2&lt;/td&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;td&gt;8.6&lt;/td&gt;
&lt;td&gt;7.8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.4&lt;/td&gt;
&lt;td&gt;7.4&lt;/td&gt;
&lt;td&gt;7.8&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;7.9&lt;/td&gt;
&lt;td&gt;7.9&lt;/td&gt;
&lt;td&gt;7.6&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;Kamakura&lt;/code&gt; (722 hits)&lt;/td&gt;
&lt;td&gt;22.2&lt;/td&gt;
&lt;td&gt;13.6&lt;/td&gt;
&lt;td&gt;11.9&lt;/td&gt;
&lt;td&gt;10.2&lt;/td&gt;
&lt;td&gt;9.1&lt;/td&gt;
&lt;td&gt;8.4&lt;/td&gt;
&lt;td&gt;7.6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7.6&lt;/td&gt;
&lt;td&gt;7.5&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;8.2&lt;/td&gt;
&lt;td&gt;7.9&lt;/td&gt;
&lt;td&gt;8.0&lt;/td&gt;
&lt;td&gt;7.8&lt;/td&gt;
&lt;td&gt;7.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8dksfub4htw3a7yw2tci.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8dksfub4htw3a7yw2tci.png" alt=" " width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fat4vx0wa3f0055svgngd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fat4vx0wa3f0055svgngd.png" alt=" " width="799" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three facts worth a headline
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. It plateaus at 8 threads: 22.2s single-threaded down to 7.4s (3.0x).&lt;/strong&gt; From there to 16 threads it stays flat at 7.4-8.2s. More threads don't help — but notably, oversubscription up to 16 didn't visibly hurt either.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. The plateau is not "the core count."&lt;/strong&gt; This machine has 4 performance + 6 efficiency cores, 10 total. The plateau lands at &lt;strong&gt;8&lt;/strong&gt; — short of all 10 cores, well past the 4 P-cores. Neither core type alone explains it. Apply the "threads = cores" folklore here and you'd pick 10 (same speed as 8, so no harm, no gain); pick 4 and you're at 10.2s — 27% slower.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Hit count doesn't matter.&lt;/strong&gt; With hit counts differing by more than an order of magnitude (10,967 vs. 722), the two curves match almost perfectly. The work is dominated by how much you scan, not how much you find.&lt;/p&gt;

&lt;p&gt;One finer observation: the scaling is sublinear from the start — 1.6x at 2 threads against an ideal 2x. The overhead and memory-bandwidth contention begin with the second thread, not the ninth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest limitations
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All numbers are warm-cache; cold was not measured&lt;/li&gt;
&lt;li&gt;One machine only (MacBook Air M4); a CPU/RAM matrix is a separate planned experiment&lt;/li&gt;
&lt;li&gt;Nothing beyond 16 threads was measured&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this means for the product: automatic
&lt;/h2&gt;

&lt;p&gt;What the data says: on this machine and workload, ~8 threads is the sweet spot, and missing it in either direction costs you. And the sweet spot will move from machine to machine. A "number of threads" setting in the UI would mostly be a device for users to pick the wrong value.&lt;/p&gt;

&lt;p&gt;So UwView Pro &lt;strong&gt;chooses the thread count automatically&lt;/strong&gt; (&lt;code&gt;UWV_SHARDS=auto&lt;/code&gt; is the default). You configure nothing. This benchmark existed to decide what "auto" should do.&lt;/p&gt;

&lt;p&gt;If you regularly search huge logs or datasets, give &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;UwView Pro&lt;/a&gt; a look — persistent index, compressed-cache search, and ~1/9 storage make both reopening and searching a step faster (all OS, $129 one-time / $9 per month).&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From the developer&lt;/strong&gt;: a list of my apps, Kindle books and open-source projects is on &lt;a href="https://github.com/amru195704" rel="noopener noreferrer"&gt;GitHub: amru195704&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A note&lt;/strong&gt;&lt;br&gt;
The information in this article is provided for reference purposes only, and its accuracy or completeness is not guaranteed. If you notice any errors or inaccuracies, please let us know in the comments and we will review and correct them.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Reading Huge Logs by Color — a Highlighter That Doesn't Stutter at 100 Million Lines</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Tue, 11 Aug 2026 13:45:34 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/reading-huge-logs-by-color-a-highlighter-that-doesnt-stutter-at-100-million-lines-9m1</link>
      <guid>https://dev.to/_156a59a8566fe532e165/reading-huge-logs-by-color-a-highlighter-that-doesnt-stutter-at-100-million-lines-9m1</guid>
      <description>&lt;p&gt;In &lt;strong&gt;v1.1&lt;/strong&gt; of &lt;a href="https://uvp.y42u.net/en/blog/uwview-github-release-en/" rel="noopener noreferrer"&gt;UwView&lt;/a&gt;, my large-file text viewer (free, source on GitHub), I implemented a &lt;strong&gt;color highlighter&lt;/strong&gt;. When I &lt;a href="https://uvp.y42u.net/en/blog/uwview-klogg-feature-comparison-v111-en/" rel="noopener noreferrer"&gt;honestly compared features&lt;/a&gt; with the industry-standard &lt;a href="https://klogg.filimonov.dev/" rel="noopener noreferrer"&gt;klogg&lt;/a&gt;, "multi-keyword color highlighting" was a clear item on my loss list — something klogg had that UwView didn't. This release fills in that line on the scoreboard.&lt;/p&gt;

&lt;p&gt;And it didn't stop at catching up. UwView &lt;strong&gt;ships with use-case presets built in from the start&lt;/strong&gt;, and also supports &lt;strong&gt;exporting/importing&lt;/strong&gt; rule sets. This article walks through what you can now do — and the design choices that keep coloring smooth &lt;strong&gt;even on a 100-million-line file&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For testing I used an &lt;strong&gt;XML file with 100,000,000 lines&lt;/strong&gt; converted from OpenStreetMap Japan data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Search's "Yellow" and Highlighting's "Red/Blue" Work Together at the Same Time
&lt;/h2&gt;

&lt;p&gt;The basic layout: body text on the left, search-results (filter) popup on the right. A search for "Wakayama" hit &lt;strong&gt;1,129 matches&lt;/strong&gt;, listed with ±1 line of surrounding context.&lt;/p&gt;

&lt;p&gt;The point to notice is that &lt;strong&gt;the yellow of the search match&lt;/strong&gt; and &lt;strong&gt;the red applied by the color highlighter&lt;/strong&gt; both appear on the same screen at the same time. UwView's highlighter is designed so that &lt;strong&gt;search matches are always drawn with top priority&lt;/strong&gt; — no matter how many colors you stack, &lt;strong&gt;the yellow of the term you're currently searching for always stays on top&lt;/strong&gt;. This avoids the common failure mode of this kind of feature, where too much coloring buries the search results.&lt;/p&gt;

&lt;p&gt;One more understated bit of engineering: coloring is &lt;strong&gt;evaluated only for the lines currently visible on screen&lt;/strong&gt;, each time. That's why, even with a 100-million-line file, the coloring never falls behind while scrolling.&lt;/p&gt;




&lt;h2&gt;
  
  
  Color Rules Are Built from Patterns and Background Colors
&lt;/h2&gt;

&lt;p&gt;Coloring is managed in a dedicated "Color Highlighter" dialog. Each line is one rule, assigning a &lt;strong&gt;text color&lt;/strong&gt; and a &lt;strong&gt;background color&lt;/strong&gt; to a &lt;strong&gt;pattern&lt;/strong&gt; (a literal string or a regular expression).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Regular expression support&lt;/strong&gt; — you can also color just the captured portion of a match.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Case sensitivity&lt;/strong&gt; (&lt;code&gt;Aa&lt;/code&gt;) and whether to &lt;strong&gt;highlight the whole line&lt;/strong&gt; can be set per rule.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rules are prioritized top to bottom.&lt;/strong&gt; When rules overlap, the lower row wins; reorder with ▲▼.&lt;/li&gt;
&lt;li&gt;Too many colors makes things harder to distinguish — aim for &lt;strong&gt;around 8 to 12 colors per screen&lt;/strong&gt;. Colors come from a color-vision-friendly 32-color palette and cycle automatically as you add rules.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can &lt;strong&gt;save a rule set under a name&lt;/strong&gt;, so you can switch between them per project or per system you're monitoring.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bundled Presets for "syslog" and "Web Access Logs"
&lt;/h2&gt;

&lt;p&gt;This is the part that goes beyond simply catching up with klogg. UwView v1.1 &lt;strong&gt;ships with commonly used coloring rules built in&lt;/strong&gt;. Pick a preset, click "Load," and the colors apply on the spot.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;syslog / Linux&lt;/strong&gt; preset colors &lt;code&gt;emerg / alert / crit / err&lt;/code&gt; red, &lt;code&gt;warning&lt;/code&gt; orange, &lt;code&gt;notice / info&lt;/code&gt; green, and also assigns colors to the PID at the start of a line (&lt;code&gt;[number]&lt;/code&gt;) and to IP addresses.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Web access (HTTP)&lt;/strong&gt; preset lets you read HTTP status codes by color: &lt;code&gt;5xx&lt;/code&gt; red, &lt;code&gt;4xx&lt;/code&gt; orange, &lt;code&gt;3xx&lt;/code&gt; blue, &lt;code&gt;2xx&lt;/code&gt; green — clusters of errors jump out at you just from skimming an access log.&lt;/p&gt;

&lt;p&gt;These presets &lt;strong&gt;can be used as-is or rewritten to your own taste&lt;/strong&gt;. A finished rule set exports as a &lt;code&gt;.uwvhl&lt;/code&gt; file and can be shared with another machine or a teammate via import — you can hand out "site-specific coloring configurations" to everyone who needs them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Search History and Predefined Filters Also Improved
&lt;/h2&gt;

&lt;p&gt;Alongside coloring, v1.1 raises the bar around &lt;strong&gt;search&lt;/strong&gt;: up to 50 history entries with autocomplete, and starred (★) searches saved for instant reuse from a dropdown. This too fills an area where klogg previously had the edge.&lt;/p&gt;

&lt;p&gt;The items still remaining on my loss list stay &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;published openly in the repository&lt;/a&gt;. The policy of laying everything out honestly and filling gaps one by one is unchanged.&lt;/p&gt;

&lt;p&gt;One thing I'm particular about, though: &lt;strong&gt;even when adding a feature I was behind on, I don't copy klogg's implementation — I redesign it into a form that feels good to use every day before shipping it.&lt;/strong&gt; The color highlighter is exactly that: not just "you can apply colors," but "the search yellow stays on top at all times," "presets bundled for common use cases," and "only visible lines are evaluated, so speed never drops at 100 million lines" — the things you actually want once you're working with genuinely huge logs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;UwView v1.1 implements a &lt;strong&gt;color highlighter&lt;/strong&gt;, filling in one line on the list of items where klogg had the edge.&lt;/li&gt;
&lt;li&gt;Supports &lt;strong&gt;regular expressions, text/background colors, rule priority, and named saves&lt;/strong&gt;. Search-match yellow always stays on top, and coloring stays fast even at 100 million lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ships with presets&lt;/strong&gt; for syslog, web access logs, and more; rule sets are shareable as &lt;code&gt;.uwvhl&lt;/code&gt; files via export/import.&lt;/li&gt;
&lt;li&gt;Search history and predefined filters also improved. Remaining gaps stay listed openly, to be filled in a form that's genuinely comfortable to use — not by copying klogg.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The commercial &lt;strong&gt;&lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;UwView Pro&lt;/a&gt;&lt;/strong&gt; is also on sale (all OS: Windows/macOS/Linux; one-time $129 / $9 per month) — persistent index for instant reopens with line numbers, search up to ~9x faster, and ~1/9-size archival storage that opens directly. The color highlighter and presets covered here work the same way in Pro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Related Articles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-github-release-en/" rel="noopener noreferrer"&gt;UwView Released on GitHub — Renewing a Windows 95-Era Large-File Text Viewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-klogg-feature-comparison-v111-en/" rel="noopener noreferrer"&gt;An Honest Comparison with klogg [v1.1.1]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-osm-realdata-en/" rel="noopener noreferrer"&gt;I Opened a Real 51GB, 890-Million-Line Dataset (OSM Japan) in UwView&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;klogg official documentation &lt;a href="https://github.com/variar/klogg/blob/master/DOCUMENTATION.md" rel="noopener noreferrer"&gt;https://github.com/variar/klogg/blob/master/DOCUMENTATION.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;amru195704/UwView (GitHub) &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;https://github.com/amru195704/UwView&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From the developer&lt;/strong&gt;: a list of my apps, Kindle books and open-source projects is on &lt;a href="https://github.com/amru195704" rel="noopener noreferrer"&gt;GitHub: amru195704&lt;/a&gt;. Screenshots of everything described here are in the &lt;a href="https://uvp.y42u.net/en/blog/uwview-v11-color-highlighter-en/" rel="noopener noreferrer"&gt;original article&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>I Rebuilt My 30-Year-Old Text Viewer in C#/Avalonia — It Matched the Industry-Standard klogg. Then I Redesigned It for Today's Hardware.</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Sat, 08 Aug 2026 13:36:13 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/i-rebuilt-my-30-year-old-text-viewer-in-cavalonia-it-matched-the-industry-standard-klogg-then-4a3c</link>
      <guid>https://dev.to/_156a59a8566fe532e165/i-rebuilt-my-30-year-old-text-viewer-in-cavalonia-it-matched-the-industry-standard-klogg-then-4a3c</guid>
      <description>&lt;p&gt;The design of my large-file text viewer &lt;a href="https://uvp.y42u.net/en/blog/uwview-github-release-en/" rel="noopener noreferrer"&gt;UwView&lt;/a&gt; traces back to &lt;strong&gt;the old UwView I distributed on Vector back in the Windows 95 era — 30 years ago&lt;/strong&gt;. I rebuilt it from scratch in C#/Avalonia, and released a premium edition, &lt;strong&gt;UwView Pro&lt;/strong&gt; (Windows/macOS/Linux; one-time $129 or $9/month; product page &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/pro-en/&lt;/a&gt;). Now that I have solid measurements from the core engine, here's a serious head-to-head against &lt;strong&gt;klogg&lt;/strong&gt;, the industry-standard viewer for huge log files.&lt;/p&gt;

&lt;p&gt;Cutting straight to the conclusion: &lt;strong&gt;when actually measured, klogg and the current (free) UwView performed at roughly the same level.&lt;/strong&gt; In other words — isn't the "industry standard" older than you'd expect? This article is about that, and about what happened when I redesigned that same architecture from scratch for today's hardware.&lt;/p&gt;




&lt;h2&gt;
  
  
  Test conditions — a real 48GB file, 892,239,125 lines
&lt;/h2&gt;

&lt;p&gt;All benchmarks were run under identical conditions on the identical file.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Target file: OSM data for all of Japan, &lt;code&gt;japan-latest.osm&lt;/code&gt; (&lt;strong&gt;47.73GB, 892,239,125 lines&lt;/strong&gt; — the same real-world data used in &lt;a href="https://uvp.y42u.net/en/blog/uwview-osm-realdata-en/" rel="noopener noreferrer"&gt;my earlier 51GB experiment&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Note on file size notation: the "48GB" figure here is 47.73GiB (bytes ÷ 1024³), rounded. macOS's own size display (SI units, ÷1000³) shows &lt;strong&gt;51.25GB&lt;/strong&gt;. Both refer to the same file (51,254,526,392 bytes).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Environment: 10-core Mac, 32GB RAM, external USB drive (measured physical throughput 0.41GB/s)&lt;/li&gt;
&lt;li&gt;Comparison target: klogg 24.11.0 (main search always uses the regex engine, Match case ON)&lt;/li&gt;
&lt;li&gt;Search hit counts were confirmed to match &lt;strong&gt;exactly across all patterns&lt;/strong&gt; among klogg, UwView, and UwView Pro (e.g., literal "Tokyo" = 10,967 hits)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Round 1: klogg vs. current UwView — nearly identical
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;klogg 24.11&lt;/th&gt;
&lt;th&gt;UwView (public release)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;First open (index build)&lt;/td&gt;
&lt;td&gt;About 110 seconds&lt;/td&gt;
&lt;td&gt;128–186 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Every subsequent open&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Every time&lt;/strong&gt;, about 110 seconds (re-indexes)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Every time&lt;/strong&gt;, 128–186 seconds (rebuilds)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search literal "Tokyo"&lt;/td&gt;
&lt;td&gt;120–135 seconds&lt;/td&gt;
&lt;td&gt;156.2 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There's some variance in the numbers, but it's clear that both tools are built on the same principle: "&lt;strong&gt;read the entire 48GB raw file, every single time&lt;/strong&gt;." Both hover around 0.3GB/s throughput — meaning both are &lt;strong&gt;pinned to the physical bandwidth ceiling of the disk&lt;/strong&gt;. That's not a matter of which tool is better; it's a matter of which design generation each belongs to.&lt;/p&gt;

&lt;p&gt;To be clear, I did not look at klogg's source code at all. This is an inference based purely on &lt;strong&gt;external measurements hitting the same physical ceiling&lt;/strong&gt;, but the underlying structure — rebuilding the index every time you open the file, and scanning the raw file every time you search — appears to belong to the same design generation.&lt;/p&gt;

&lt;p&gt;And current UwView's design originates from the old UwView of 30 years ago. The first discovery from this comparison: the industry-standard klogg performs on par with a 30-year-old design.&lt;/p&gt;

&lt;h3&gt;
  
  
  One point where it isn't even "on par"
&lt;/h3&gt;

&lt;p&gt;One feature the old UwView has had consistently since 30 years ago is that "&lt;strong&gt;the entire file is visible the moment you open it&lt;/strong&gt;" (progressive open). Current UwView also lets you jump freely to the middle or end of the file even while the index is still being built.&lt;/p&gt;

&lt;p&gt;What about klogg? During my measurements, I confirmed that &lt;strong&gt;only the beginning of the file is visible until index building finishes&lt;/strong&gt; (you cannot scroll to the middle or end). For a 48GB file, that's roughly 110 seconds during which the end of the file is simply off-limits. On this one point, klogg doesn't even match the 30-year-old design — it falls short of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Round 2: Enter UwView Pro — a design rebuilt for "now"
&lt;/h2&gt;

&lt;p&gt;What's changed between 30 years ago and today? RAM in the tens of gigabytes is now standard, CPUs commonly have 10 cores, and compression like zstd — "compression faster than the disk itself" — is now available. UwView Pro's engine was redesigned from the ground up around these assumptions.&lt;/p&gt;

&lt;p&gt;At the core is a &lt;strong&gt;sidecar approach&lt;/strong&gt;. Three key points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;On the first open&lt;/strong&gt;, a zstd-compressed cache is generated at the same time the index is built (compression happens on otherwise-idle CPU cycles between disk reads, so it adds essentially zero extra wait time)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;From the second open onward&lt;/strong&gt;, only the saved index needs to be read (milliseconds). Searches read the &lt;strong&gt;5.3GB compressed cache&lt;/strong&gt; instead of the 48GB raw file (a 1/9 reduction in bytes read)&lt;/li&gt;
&lt;li&gt;The compressed cache preserves every byte of the original file losslessly, with block-level checksums. &lt;strong&gt;Even if you delete the original file and keep only the 1/9-sized cache, you can still open and search it directly&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Overall comparison table — measured results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;klogg 24.11&lt;/th&gt;
&lt;th&gt;UwView (public release)&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;UwView Pro (on sale)&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Pro ÷ klogg&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;First open&lt;/td&gt;
&lt;td&gt;~110 s (&lt;strong&gt;only the beginning visible&lt;/strong&gt; until complete)&lt;/td&gt;
&lt;td&gt;128–186 s (entire file visible immediately)&lt;/td&gt;
&lt;td&gt;140 s (includes index + compressed cache; entire file visible immediately)&lt;/td&gt;
&lt;td&gt;About the same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Every subsequent open&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~110 s every time&lt;/td&gt;
&lt;td&gt;128–186 s every time&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.02–0.07 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,500x or more&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search literal "Tokyo"&lt;/td&gt;
&lt;td&gt;120–135 s&lt;/td&gt;
&lt;td&gt;156.2 s&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14.3 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;About 9x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search case-insensitive "Tokyo"&lt;/td&gt;
&lt;td&gt;~120 s&lt;/td&gt;
&lt;td&gt;(not measured)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14.0 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;About 8.6x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search regex "Tok[yi]o"&lt;/td&gt;
&lt;td&gt;~130 s&lt;/td&gt;
&lt;td&gt;(not measured)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;29.8 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;About 4.4x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Search regex "name:en.*Tokyo"&lt;/td&gt;
&lt;td&gt;~130 s&lt;/td&gt;
&lt;td&gt;(not measured)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;29.2 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;About 4.4x&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disk footprint (archival use)&lt;/td&gt;
&lt;td&gt;48GB (original required)&lt;/td&gt;
&lt;td&gt;48GB (original required)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;5.3GB&lt;/strong&gt; (original deletable; checksum-protected)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1/9&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  An honest note
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instant to &lt;em&gt;view&lt;/em&gt; from the very first open.&lt;/strong&gt; UwView lets you read, scroll and search the entire text the moment you open it (klogg shows only the head until indexing finishes). The index and compressed cache are &lt;strong&gt;built on the first open, in the background&lt;/strong&gt; (about 140 s for 48GB — bound by reading the raw file once at 0.41GB/s; you can browse while it runs). Because indexing happens on the first open, &lt;strong&gt;from the second open on it's instant, with line numbers&lt;/strong&gt; (0.02–0.07 s).&lt;/li&gt;
&lt;li&gt;All figures above are measurements from a single real-world environment. RAM capacity, storage speed, and file contents will all affect the numbers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Current status
&lt;/h2&gt;

&lt;p&gt;The engine (parallel index building, parallel search, and the sidecar mechanism) is fully implemented, and every figure above comes from measurements of working code. &lt;strong&gt;UwView Pro is on sale now&lt;/strong&gt; (Windows/macOS/Linux; one-time $129 or $9/month). → &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/pro-en/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Current UwView (free) remains available on &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Give the "entire file visible the moment you open it" experience a try — it's been a core part of UwView for 30 years.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Measured head-to-head, the industry-standard klogg and current UwView (built on a 30-year-old design) perform at roughly the same level — both belong to the "read the entire raw file every time" generation.&lt;/li&gt;
&lt;li&gt;On "the entire file is visible the moment you open it," klogg doesn't even match the 30-year-old UwView (only the head is visible until indexing completes).&lt;/li&gt;
&lt;li&gt;UwView Pro is a next-generation engine redesigned for today's hardware (abundant RAM, multi-core CPUs, compression faster than disk). Measured on 48GB / 892M lines: 1,500x+ for subsequent opens, ~9x for search, 1/9 the storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UwView Pro is on sale now&lt;/strong&gt; (Windows/macOS/Linux; one-time $129 or $9/month). → &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/pro-en/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Related articles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-github-release-en/" rel="noopener noreferrer"&gt;UwView Released on GitHub — Renewing a Windows 95-Era Large-File Text Viewer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-osm-realdata-en/" rel="noopener noreferrer"&gt;I Opened a Real 51GB, 892,239,125-Line Dataset (OSM Japan) in UwView&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-theoretical-line-limit-en/" rel="noopener noreferrer"&gt;How Many Lines Can UwView Theoretically Open?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;amru195704/UwView (GitHub) &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;https://github.com/amru195704/UwView&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;klogg (GitHub) &lt;a href="https://github.com/variar/klogg" rel="noopener noreferrer"&gt;https://github.com/variar/klogg&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenStreetMap data (Geofabrik: japan-latest.osm) &lt;a href="https://download.geofabrik.de/asia/japan.html" rel="noopener noreferrer"&gt;https://download.geofabrik.de/asia/japan.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Zstandard (zstd) &lt;a href="https://github.com/facebook/zstd" rel="noopener noreferrer"&gt;https://github.com/facebook/zstd&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From the developer&lt;/strong&gt;: a list of my apps, Kindle books and open-source projects is on &lt;a href="https://github.com/amru195704" rel="noopener noreferrer"&gt;GitHub: amru195704&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Shelve an Investigated Log at 1/9th the Size, Reopen It Tomorrow Right Where You Left Off</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Wed, 05 Aug 2026 13:59:29 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/shelve-an-investigated-log-at-19th-the-size-reopen-it-tomorrow-right-where-you-left-off-53b6</link>
      <guid>https://dev.to/_156a59a8566fe532e165/shelve-an-investigated-log-at-19th-the-size-reopen-it-tomorrow-right-where-you-left-off-53b6</guid>
      <description>&lt;p&gt;In &lt;a href="https://uvp.y42u.net/en/blog/uwview-pro-release-en/" rel="noopener noreferrer"&gt;We Released UwView Pro&lt;/a&gt;, I introduced the Archive feature (store at roughly 1/9th the size and view without unpacking) and Session Restore, added in Ver1.1.1 (reopen the app and pick up right where you left off), as two separate features. This time, let's walk through what happens when you connect these two into &lt;strong&gt;a single investigation workflow&lt;/strong&gt;, with concrete steps.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Scenario — "I Want to Wrap Up Today's Investigation, but I Might Look at It Again Tomorrow"
&lt;/h2&gt;

&lt;p&gt;A common situation in incident investigation or log review is: "I want to reach a stopping point today, but I can't say the investigation is completely finished." A log file in this state creates a bind:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Too early to delete it (you might need to look at it again)&lt;/li&gt;
&lt;li&gt;Too heavy to just leave as-is (multiple 48GB-class logs piling up on your desk)&lt;/li&gt;
&lt;li&gt;Leaving the tab open indefinitely isn't realistic either (you want to restart your PC for other work)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly the dilemma described in &lt;a href="https://uvp.y42u.net/en/blog/uwview-pro-archive-teaser-en/" rel="noopener noreferrer"&gt;"To Delete or Not to Delete"&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Workflow 1: "Shelve It" Before Finishing the Investigation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Once you've finished a round of searching, color-coding, and bookmarking, run &lt;strong&gt;Archive&lt;/strong&gt; from the File menu.&lt;/li&gt;
&lt;li&gt;The original file's contents are compressed with a checksum into an indexed archive with a &lt;code&gt;.uwvz&lt;/code&gt; extension. In my measurement, a 48GB log came down to roughly 5.3GB (see the &lt;a href="https://uvp.y42u.net/en/blog/uwview-pro-benchmark-3sizes-en/" rel="noopener noreferrer"&gt;benchmark article&lt;/a&gt; for details).&lt;/li&gt;
&lt;li&gt;Once you've confirmed the archive was created, you can delete the original 48GB file. The &lt;code&gt;.uwvz&lt;/code&gt; file can be opened and searched directly, without unpacking.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;At this point, your desk (disk) has shrunk from 48GB to 5.3GB, and you're still ready to respond instantly if you need to look at it again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Workflow 2: Pause Work While Leaving Tabs Open
&lt;/h2&gt;

&lt;p&gt;There are also logs where you're not ready to commit to archiving yet — you're still actively working on them. This is where Ver1.1.1's &lt;strong&gt;Session Restore&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Even if you quit the app or restart your PC with multiple logs open in tabs, the &lt;strong&gt;tabs you had open are restored exactly as they were&lt;/strong&gt; the next time you launch the app.&lt;/li&gt;
&lt;li&gt;For large logs, if the index still lives with the regular file rather than in a &lt;code&gt;.uwvz&lt;/code&gt;, reopening rebuilds the index on that open, in the background (you can browse while it runs) — but your search conditions, color-coding rules, and bookmark positions are all preserved regardless.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Session Restore's role is this: even if you close your laptop after saying "that's it for today," you can resume exactly where you left off the next morning without any hesitation.&lt;/p&gt;




&lt;h2&gt;
  
  
  When to Use Workflow 1 vs. Workflow 2
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;State&lt;/th&gt;
&lt;th&gt;Feature to Use&lt;/th&gt;
&lt;th&gt;Effect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Investigation done, but can't delete yet&lt;/td&gt;
&lt;td&gt;Archive (&lt;code&gt;.uwvz&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Compresses disk usage to roughly 1/9th, reviewable without unpacking&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Investigation ongoing, pausing for today&lt;/td&gt;
&lt;td&gt;Session Restore&lt;/td&gt;
&lt;td&gt;Carries tabs, search state, color-coding, and bookmarks over to next time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Investigation done and unlikely to continue&lt;/td&gt;
&lt;td&gt;Archive → Delete&lt;/td&gt;
&lt;td&gt;Minimizes disk usage in the end&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In practice, you'll often use these two in sequence: &lt;strong&gt;keep working with Session Restore maintaining your tabs for the time being, then drop into Archive once you reach a natural break point.&lt;/strong&gt; Even a &lt;code&gt;.uwvz&lt;/code&gt; archive that's been reopened is treated as a regular tab just like an ordinary log file, so it's still subject to Session Restore.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Combination Works
&lt;/h2&gt;

&lt;p&gt;The free version of UwView is focused on &lt;strong&gt;opening&lt;/strong&gt; huge files; the Pro version handles the &lt;strong&gt;operational&lt;/strong&gt; side of things after the file is open. Archive covers "storage" and Session Restore covers "continuity of work" — because these two responsibilities are cleanly separated, the full arc from "end of one day" to "resuming the next morning" — something hard to see when each feature is explained on its own — only comes into focus once you combine them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For logs you've finished investigating but can't delete yet, shelve them with &lt;strong&gt;Archive&lt;/strong&gt; (roughly 1/9th the size, checksummed, no unpacking needed)&lt;/li&gt;
&lt;li&gt;For work still in progress, carry your tabs, search state, and color-coding forward with &lt;strong&gt;Session Restore&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The realistic situation of "I'm done for today, but I might look at this again tomorrow" is covered by combining these two features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if a huge log is eating your disk and you want it &lt;strong&gt;compressed for storage while staying searchable at speed, give &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;UwView Pro&lt;/a&gt; a look&lt;/strong&gt; — persistent index, compressed-cache search, and ~1/9 storage make both reopening and searching a step faster (all OS, $129 one-time / $9 per month). The free version is available on &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Related Articles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-pro-release-en/" rel="noopener noreferrer"&gt;We Released UwView Pro — Instantly Open Huge Files, Anytime (All OS: Windows/macOS/Linux)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-pro-archive-teaser-en/" rel="noopener noreferrer"&gt;To Delete or Not to Delete a Log You've Finished Reading — A Third Option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-v111-quick-colorize-restore-en/" rel="noopener noreferrer"&gt;UwView Ver1.1.1 — Right-Click to Color-Code Instantly, Reopen and Pick Up Right Where You Left Off&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From the developer&lt;/strong&gt;: a list of my apps, Kindle books and open-source projects is on &lt;a href="https://github.com/amru195704" rel="noopener noreferrer"&gt;GitHub: amru195704&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>I Expanded the Entire US OpenStreetMap to a Single 258 GB XML File — 4,509,830,821 Lines, and What Broke</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Sat, 01 Aug 2026 11:40:31 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/i-expanded-the-entire-us-openstreetmap-to-a-single-258-gb-xml-file-4509830821-lines-and-what-21ci</link>
      <guid>https://dev.to/_156a59a8566fe532e165/i-expanded-the-entire-us-openstreetmap-to-a-single-258-gb-xml-file-4509830821-lines-and-what-21ci</guid>
      <description>&lt;p&gt;A few days ago I benchmarked the native and browser builds of my viewer against &lt;a href="https://uvp.y42u.net/en/blog/uwview-uvf-vs-wasm-benchmark-en/" rel="noopener noreferrer"&gt;a 3.16 GB, 100-million-line XML file carved out of Japan&lt;/a&gt;. The whole time I kept thinking the same thing: at 100 million lines, this thing still isn't trying.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;UwView&lt;/a&gt; is built around one claim — "open any huge file, instantly readable and searchable." If you're going to say that out loud, you owe it to yourself to find out &lt;strong&gt;where it breaks&lt;/strong&gt;. So I went and got the OpenStreetMap data for the entire United States.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the test file
&lt;/h2&gt;

&lt;p&gt;Genuinely huge files are surprisingly hard to come by. Logs get rotated. Dumps get chunked. &lt;strong&gt;An unsplit, near-terabyte single file&lt;/strong&gt; is something you basically have to manufacture yourself.&lt;/p&gt;

&lt;p&gt;So I took the &lt;a href="https://download.geofabrik.de/" rel="noopener noreferrer"&gt;Geofabrik&lt;/a&gt; extract for the whole US (PBF, about 11 GB) and expanded it to XML with &lt;a href="https://osmcode.org/osmium-tool/" rel="noopener noreferrer"&gt;&lt;code&gt;osmium cat&lt;/code&gt;&lt;/a&gt;. &lt;strong&gt;About 15 minutes&lt;/strong&gt; later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;us-260726.osm
258,679,440,228 bytes  =  258.68 GB (240.9 GiB)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ls -lh&lt;/code&gt; reports &lt;code&gt;241G&lt;/code&gt; — same file, GiB spelling. One XML document. No splitting.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;Measured on real macOS hardware with UwView Pro, stopwatch-timed from the UI at second-level precision.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Measured&lt;/th&gt;
&lt;th&gt;Conditions&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;First open (until indexing completes)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5 min 28 s (328 s)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;full scan of 258.68 GB ≈ 789 MB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Second open onward&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;instant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.uwvz&lt;/code&gt; sidecar (Pro feature)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total lines&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4,509,830,821&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;determined once indexing finished&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search "New York"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34.8 s / 100,492 hits&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;after indexing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Search "Boston"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~34 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;after indexing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;.uwvz&lt;/code&gt; sidecar size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;28.61 GB&lt;/strong&gt; (28,608,409,551 B)&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;~11%&lt;/strong&gt; of the original&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The line count broke &lt;code&gt;int&lt;/code&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4,509,830,821  &amp;gt;  2,147,483,647
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the part I want to put in front of anyone who has ever written a text viewer, a log parser, or an indexer. &lt;strong&gt;4.5 billion lines does not fit in a signed 32-bit integer.&lt;/strong&gt; Not the offsets — those obviously need 64-bit at this size — the &lt;em&gt;line numbers themselves&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;If line numbers are &lt;code&gt;int&lt;/code&gt; anywhere in the pipeline, this file doesn't produce an error. It produces a &lt;strong&gt;negative line number&lt;/strong&gt;, silently, somewhere past line 2,147,483,647, and every jump and every search result after that point is garbage. UwView carries line numbers as &lt;code&gt;long&lt;/code&gt; throughout, which until this test was a design decision I had never actually needed. Now I have the receipt.&lt;/p&gt;

&lt;h2&gt;
  
  
  You can read the file &lt;strong&gt;while&lt;/strong&gt; the index is still building
&lt;/h2&gt;

&lt;p&gt;This is the screen I most want to show, and the reason I bothered building the file at all. (Screenshots are in the &lt;a href="https://uvp.y42u.net/en/blog/uwview-osm-usa-258gb-en/" rel="noopener noreferrer"&gt;full write-up&lt;/a&gt;.)&lt;/p&gt;

&lt;p&gt;The tab reads &lt;code&gt;us-260726.osm 10%&lt;/code&gt;, the status bar shows an indexing progress bar with a cancel button — and the body is already displaying real &lt;code&gt;&amp;lt;relation&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;member type="way" ref="..."/&amp;gt;&lt;/code&gt; elements, and it scrolls.&lt;/p&gt;

&lt;p&gt;That's &lt;strong&gt;page-mode instant open&lt;/strong&gt;: the file is never loaded, only the visible window is read and painted. So at 258.68 GB content appears the moment you pick the file. Indexing runs behind it, and &lt;strong&gt;line numbers appear when it finishes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most viewers show you the head of the file and nothing else until indexing completes. For 5 minutes and 28 seconds, do you stare at page one, or do you &lt;strong&gt;start reading&lt;/strong&gt;? That gap matters most precisely when you are in trouble at 3 a.m.&lt;/p&gt;

&lt;p&gt;The line-number gutter is empty at this stage. Line numbers arrive after indexing — by design, and I'd rather say it than hide it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Search time is bound by data scanned, not hits found
&lt;/h2&gt;

&lt;p&gt;The most interesting result was search.&lt;/p&gt;

&lt;p&gt;"New York" returned &lt;strong&gt;100,492 hits&lt;/strong&gt; in &lt;strong&gt;34.8 seconds&lt;/strong&gt;, listed in the &lt;a href="https://uvp.y42u.net/en/blog/uwview-filter-popup-jump-save-context-en/" rel="noopener noreferrer"&gt;filter results window&lt;/a&gt; with line numbers and ±1 line of context — things like &lt;code&gt;&amp;lt;tag k="operator" v="New York City Transit Authority"/&amp;gt;&lt;/code&gt;. Very much OSM.&lt;/p&gt;

&lt;p&gt;"Boston" took &lt;strong&gt;about 34 seconds&lt;/strong&gt;. Wildly different hit counts, essentially identical time.&lt;/p&gt;

&lt;p&gt;So full-text search here is bound by &lt;strong&gt;how much data it scans, not how many matches it finds&lt;/strong&gt;. That's a quietly useful property in practice: you never have to guess whether a rare word will be fast or a common word slow. Knowing that &lt;strong&gt;any word costs about 34 seconds&lt;/strong&gt; is enough to decide whether you have time to go make coffee.&lt;/p&gt;

&lt;p&gt;258.68 GB ÷ 34 s works out to about 7.6 GB/s, but that is a &lt;strong&gt;nominal figure&lt;/strong&gt;, and I want to be explicit about it: Pro's search reads through the saved compressed cache (28.61 GB), so the bytes actually touched are far fewer. &lt;strong&gt;This is not a claim that an SSD hit 7.6 GB/s.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The sidecar is 11% of the original
&lt;/h2&gt;

&lt;p&gt;On first open, UwView Pro writes the index plus compressed data into a &lt;code&gt;.uwvz&lt;/code&gt; sidecar. Here it landed at &lt;strong&gt;28.61 GB — about 11% of 258.68 GB&lt;/strong&gt;, roughly 1/9.&lt;/p&gt;

&lt;p&gt;That 28.61 GB is what turns 5 min 28 s into zero on every subsequent open. And 11% is also a storage story: instead of keeping the 258.68 GB XML around, keep the sidecar and open and search &lt;em&gt;that&lt;/em&gt; directly when you need it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;All figures are from &lt;strong&gt;one machine, one file, one run each&lt;/strong&gt;. Different hardware and storage will give different numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The 5 min 28 s first open cannot be shortened.&lt;/strong&gt; 258.68 GB has to be read through once. The claim was never "fastest first open" — it's that &lt;strong&gt;you can read during it&lt;/strong&gt;, and &lt;strong&gt;every open after that is instant with line numbers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search needs the index.&lt;/strong&gt; Browsing works while indexing runs; full-text search waits for it to finish.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The instant second open is a Pro feature.&lt;/strong&gt; Free UwView doesn't persist a sidecar, so it rebuilds the index in the background each time — browsing and searching from the first open work the same.&lt;/li&gt;
&lt;li&gt;"≈789 MB/s" and "≈7.6 GB/s" are &lt;strong&gt;derived&lt;/strong&gt; (size ÷ elapsed), not storage benchmarks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Testing at a size nobody meets in real work wasn't about bragging. It was about finding out whether the design claims survive contact with it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At 10% indexed, the whole file was already browsable and scrollable&lt;/li&gt;
&lt;li&gt;4,509,830,821 lines, and jumping to the end was instantaneous&lt;/li&gt;
&lt;li&gt;Search cost ~34 s regardless of the word, and 100k+ hits came back with context&lt;/li&gt;
&lt;li&gt;A 28.61 GB sidecar (~11%) made every reopen instant&lt;/li&gt;
&lt;li&gt;And the line count itself proved why &lt;code&gt;long&lt;/code&gt; was never optional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Near a terabyte, I didn't have to change how I say it.&lt;/p&gt;

&lt;p&gt;UwView is free and cross-platform (Windows / macOS / Linux, plus a WASM build). If you work with big logs or dumps, throw it at the largest file you own — and if it breaks, please tell me. That's the useful part.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full write-up &amp;amp; screenshots (original): &lt;a href="https://uvp.y42u.net/en/blog/uwview-osm-usa-258gb-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/blog/uwview-osm-usa-258gb-en/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source / roadmap: &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;https://github.com/amru195704/UwView&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Product ($129 one-time / $9 per month, cross-platform): &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/pro-en/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Data: © OpenStreetMap contributors, ODbL — &lt;a href="https://www.openstreetmap.org/copyright" rel="noopener noreferrer"&gt;https://www.openstreetmap.org/copyright&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why We Split Search Results Into a Separate Window — Jump, Save, and Context Lines You Can Use \"While Looking\" With the Filter Popup</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Mon, 27 Jul 2026 02:27:20 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/why-we-split-search-results-into-a-separate-window-jump-save-and-context-lines-you-can-use-5bdh</link>
      <guid>https://dev.to/_156a59a8566fe532e165/why-we-split-search-results-into-a-separate-window-jump-save-and-context-lines-you-can-use-5bdh</guid>
      <description>&lt;p&gt;We've moved UwView / UwView Pro's (UVF / UVP) search and filter results out of the &lt;strong&gt;inline, overwrite-the-main-view&lt;/strong&gt; display and into an &lt;strong&gt;independent popup window&lt;/strong&gt;. It sounds like a small change, but it fixes the one thing that kept getting in the way when reading huge logs: not being able to jump back to the original position while still looking at your results.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Changed
&lt;/h2&gt;

&lt;p&gt;Until now, filtering replaced the main text view in place, showing only the lines that matched your search. You could see the list of hits, but you couldn't check the &lt;strong&gt;surrounding context&lt;/strong&gt; in the original file or look at another part of the file at the same time.&lt;/p&gt;

&lt;p&gt;Now that filter results live in a &lt;strong&gt;non-modal, separate window&lt;/strong&gt;, three things are possible at once.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3nxjvhomtptep1ezab7p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3nxjvhomtptep1ezab7p.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Jump — go from the result list straight to the matching line in the document
&lt;/h3&gt;

&lt;p&gt;Double-click (or press Enter on) a hit in the popup, and the main view scrolls to that exact line and briefly highlights it. The popup stays open the whole time, so you can &lt;strong&gt;go back and forth between the result list and the document body&lt;/strong&gt; as many times as you like.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Save — export the filtered results to a separate file
&lt;/h3&gt;

&lt;p&gt;The "Save…" button in the toolbar lets you export the filtered results as their own file. You can combine "body text only / line numbers + body text" with "hits only / include surrounding context," and the export streams line by line instead of loading everything into memory, with progress and cancel support. Even on logs with millions of matching lines, saving won't freeze the app.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Context lines (±N) — see what the hit line alone doesn't tell you
&lt;/h3&gt;

&lt;p&gt;You can specify how many lines before and after each hit to show alongside it. When the context ranges of two nearby hits overlap or touch, they're automatically &lt;strong&gt;merged into a single block&lt;/strong&gt; so lines never appear twice (for example, if lines 100 and 103 both match and you're showing 2 lines of context, lines 98–105 are shown as one merged block).&lt;/p&gt;

&lt;h2&gt;
  
  
  Free vs. Pro
&lt;/h2&gt;

&lt;p&gt;We revisited how much of this to open up in the free version while building it. We originally planned to keep context-line display Pro-only, but ended up prioritizing the user experience and opening it up to the free version too, &lt;strong&gt;with a cap&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;UwView (Free)&lt;/th&gt;
&lt;th&gt;UwView Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Popup window&lt;/td&gt;
&lt;td&gt;Yes (one window, follows the active tab)&lt;/td&gt;
&lt;td&gt;Yes (a separate window per tab)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jump &amp;amp; Save&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context lines (±N)&lt;/td&gt;
&lt;td&gt;Yes (N = 0 or 1 only)&lt;/td&gt;
&lt;td&gt;Yes (N up to 64)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rectangle selection inside the popup&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The free version caps context display at the hit line plus one line before and after (three lines max), while Pro lets you specify up to 64 lines of context. The free version's popup is always a single window that follows whichever tab is active, whereas Pro can keep an independent popup open per tab at the same time. Drag-based rectangle selection and saving inside the popup remain Pro-only.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why We Kept "Save" in the Free Version
&lt;/h2&gt;

&lt;p&gt;Exporting search results was originally floated as a possible Pro differentiator in our early product strategy. But partway through implementation, we decided that the bigger UX problem — not being able to get back to where you were while looking at your results — mattered more, so &lt;strong&gt;we kept Jump and Save in the free version&lt;/strong&gt;. We shifted Pro's differentiation instead toward things that matter more for continuous, heavy-duty log operations: context lines up to 64, independent popups per tab, and rectangle selection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood (Briefly)
&lt;/h2&gt;

&lt;p&gt;The display and the save path share the same logic. We built a single function that takes a set of hit lines and produces "blocks" that include N lines of context (with overlap merging), and both the on-screen view and the file export call that same function. On the display side, we use UI virtualization that lazily resolves rows block by block, so scrolling stays smooth even with millions of hits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We moved filter/search results out of the inline, overwrite-the-main-view display and into an &lt;strong&gt;independent popup window&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;From the popup, you can now &lt;strong&gt;jump&lt;/strong&gt; to the matching line in the document, &lt;strong&gt;save&lt;/strong&gt; results to a separate file, and view &lt;strong&gt;±N lines of context&lt;/strong&gt; around each hit&lt;/li&gt;
&lt;li&gt;The free version limits you to one popup and up to one line of context; UwView Pro adds an independent popup per tab, context lines up to 64, and rectangle selection&lt;/li&gt;
&lt;li&gt;We prioritized the "use it while looking" experience by keeping Jump and Save free, and shifted Pro's differentiation toward more advanced operational features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want to search a huge log while still being able to move around the document, try this popup feature in &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;UwView&lt;/a&gt; (free, open source). If you want independent popups per tab and rectangle selection on top of that, take a look at UwView Pro (all OS, $129 one-time / $9 per month).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full write-up &amp;amp; images (original): &lt;a href="https://uvp.y42u.net/en/blog/uwview-filter-popup-jump-save-context-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/blog/uwview-filter-popup-jump-save-context-en/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source / roadmap: &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;https://github.com/amru195704/UwView&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Product ($129 one-time / $9 per month, cross-platform): &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/pro-en/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>avalonia</category>
      <category>uwview</category>
      <category>syslog</category>
    </item>
    <item>
      <title>How much slower is the browser build, really? — UwView native (UVF) vs WASM, measured on the same file</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Mon, 27 Jul 2026 02:22:43 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/how-much-slower-is-the-browser-build-really-uwview-native-uvf-vs-wasm-measured-on-the-same-5d4d</link>
      <guid>https://dev.to/_156a59a8566fe532e165/how-much-slower-is-the-browser-build-really-uwview-native-uvf-vs-wasm-measured-on-the-same-5d4d</guid>
      <description>&lt;p&gt;&lt;a href="https://uvp.y42u.net/blog/uwview-github-release/" rel="noopener noreferrer"&gt;UwView&lt;/a&gt;, my large text-file viewer, runs both as a &lt;strong&gt;native desktop app (UVF)&lt;/strong&gt; and &lt;strong&gt;in the browser (WASM)&lt;/strong&gt; — same code, same feature set. Naturally, a different runtime means different speed. "It runs in the browser, so it must be slow, right?" To find out, I &lt;strong&gt;opened the exact same file in both and ran the same workflow&lt;/strong&gt;, stopwatch in hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test conditions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;File&lt;/strong&gt;: one chunk of the full-Japan OpenStreetMap extract, &lt;code&gt;japan-dv-ah&lt;/code&gt; — about &lt;strong&gt;3.16 GB / 100,000,000 lines&lt;/strong&gt; of XML.&lt;/li&gt;
&lt;li&gt;Same machine, same folder. Native UVF and browser WASM (served on &lt;code&gt;localhost&lt;/code&gt;), driven in turn.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workflow&lt;/strong&gt;: open → full-text search for "東京" (Tokyo) → show ±1 lines of context → jump to the middle and end → close.&lt;/li&gt;
&lt;li&gt;Timing is stopwatch-level (seconds). Hit counts were cross-checked between the two.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;UVF (native, free)&lt;/th&gt;
&lt;th&gt;WASM (browser)&lt;/th&gt;
&lt;th&gt;Gap&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Page-mode instant display (the moment you open)&lt;/td&gt;
&lt;td&gt;instant&lt;/td&gt;
&lt;td&gt;instant&lt;/td&gt;
&lt;td&gt;equal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open → index complete (line mode)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;≤1 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~35 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~35×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full-text search "東京" (6,204 hits — identical on both)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt;1 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~15–20 s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~15–20×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Show ±1 lines of context&lt;/td&gt;
&lt;td&gt;instant&lt;/td&gt;
&lt;td&gt;instant&lt;/td&gt;
&lt;td&gt;equal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jump from a hit to the source line&lt;/td&gt;
&lt;td&gt;instant&lt;/td&gt;
&lt;td&gt;instant&lt;/td&gt;
&lt;td&gt;equal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jump to middle (50%) / end (100%)&lt;/td&gt;
&lt;td&gt;instant each&lt;/td&gt;
&lt;td&gt;instant&lt;/td&gt;
&lt;td&gt;equal&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What it shows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The "readable the instant you open it" experience is essentially the same&lt;/strong&gt; on both. UwView's core trick — &lt;strong&gt;instant page-mode open&lt;/strong&gt; (never loading the whole file, drawing only what's on screen) — works in the browser too: content appears the moment you pick the file. UI actions like ±1 context and jumping from a result to the source line are &lt;strong&gt;instant in WASM as well&lt;/strong&gt; — they're lightweight redraws, so the runtime barely matters.&lt;/p&gt;

&lt;p&gt;The gap shows up in the &lt;strong&gt;heavy work: building the index and running full-text search&lt;/strong&gt;. There, native wins big: &lt;strong&gt;~35× on indexing and ~15–20× on search&lt;/strong&gt;. WASM takes long enough to show a progress bar — about 35 s to index 100 M lines, 15–20 s to search "東京". Native finishes both in about a second.&lt;/p&gt;

&lt;p&gt;Crucially, &lt;strong&gt;the hit counts matched exactly at 6,204&lt;/strong&gt; — so &lt;strong&gt;the speed differs, but the results are identical&lt;/strong&gt;. The browser build isn't cutting corners on correctness. If that had drifted, the whole benchmark would be worthless, so confirming it mattered a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the difference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native UVF&lt;/strong&gt; runs as native .NET with a &lt;strong&gt;memory-mapped file&lt;/strong&gt;, using disk and CPU directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser WASM&lt;/strong&gt; runs on WebAssembly (a step slower on CPU) and reads via &lt;strong&gt;asynchronous &lt;code&gt;Blob.slice&lt;/code&gt;&lt;/strong&gt;. Even with the same OS cache state, "scan-the-whole-thing" CPU work — indexing, full-text search — is where the gap opens up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conversely, &lt;strong&gt;"only what's visible" work like display and small redraws is plenty fast even in WASM&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The native run had this file warm in the &lt;strong&gt;OS cache&lt;/strong&gt; (hence ≤1 s to index). But WASM's slowness is CPU-bound, so matching cache state wouldn't change the trend.&lt;/li&gt;
&lt;li&gt;Timing is stopwatch-level (&lt;strong&gt;seconds&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Other terms (Nagoya, Osaka) behaved the same (~15–20 s each).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Which to use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;browser WASM build&lt;/strong&gt; is about &lt;strong&gt;running UwView's features on the spot with zero install&lt;/strong&gt; — handy for a quick peek at a huge file, or trying it on a shared machine.&lt;/li&gt;
&lt;li&gt;For &lt;strong&gt;serious large-file work, use the free native UVF&lt;/strong&gt; — indexing and search are an order of magnitude faster.&lt;/li&gt;
&lt;li&gt;And for &lt;strong&gt;the fastest of all — instant re-open, archive storage&lt;/strong&gt; — that's the paid UwView Pro.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"Same features work in the browser; real speed lives in the native build" — exactly as designed, and a satisfying result. UwView is free, so if you wrangle big logs, give it a try. The browser build needs no install: &lt;a href="https://amru195704.github.io/UwView/" rel="noopener noreferrer"&gt;https://amru195704.github.io/UwView/&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full write-up &amp;amp; images (original): &lt;a href="https://uvp.y42u.net/en/blog/uwview-uvf-vs-wasm-benchmark-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/blog/uwview-uvf-vs-wasm-benchmark-en/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source / roadmap: &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;https://github.com/amru195704/UwView&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Product ($129 one-time / $9 per month, cross-platform): &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/pro-en/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>webassembly</category>
      <category>browser</category>
      <category>uwview</category>
    </item>
    <item>
      <title>I Opened 51GB / 890M Lines of Real Data — Then Calculated How Far It Could Theoretically Go (~9.2 Quintillion Lines)</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Mon, 27 Jul 2026 01:10:04 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/i-opened-51gb-890m-lines-of-real-data-then-calculated-how-far-it-could-theoretically-go-92-41pl</link>
      <guid>https://dev.to/_156a59a8566fe532e165/i-opened-51gb-890m-lines-of-real-data-then-calculated-how-far-it-could-theoretically-go-92-41pl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhkijey7073oypxp444gy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhkijey7073oypxp444gy.png" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When I &lt;a href="https://uvp.y42u.net/en/blog/uwview-github-release-en/" rel="noopener noreferrer"&gt;released my large-file text viewer &lt;strong&gt;UwView&lt;/strong&gt; on GitHub&lt;/a&gt;, I claimed it "handles up to roughly 200 million lines at high speed." But until then, my measurements were all on &lt;strong&gt;synthetic data&lt;/strong&gt; — files containing nothing but sequential line numbers. So first I put it to the test on real data an order of magnitude bigger, and then I worked out &lt;strong&gt;how far it could go theoretically&lt;/strong&gt;, straight from my own code's data types and structures.&lt;/p&gt;

&lt;p&gt;For the test I chose an XML dump of the entire &lt;strong&gt;OpenStreetMap (OSM) Japan dataset&lt;/strong&gt;. The result: a file of &lt;strong&gt;51GB and roughly 890 million lines&lt;/strong&gt; — more than four times the "200 million lines" the product advertises.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repository:&lt;/strong&gt; &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;amru195704/UwView&lt;/a&gt; (PolyForm Internal Use License 1.0.0)&lt;/p&gt;




&lt;h2&gt;
  
  
  How I Built the Test Data — Turning OSM Japan into a 51GB XML File
&lt;/h2&gt;

&lt;p&gt;OSM's Japan data is distributed by &lt;a href="https://download.geofabrik.de/asia/japan.html" rel="noopener noreferrer"&gt;Geofabrik&lt;/a&gt; in binary &lt;code&gt;.osm.pbf&lt;/code&gt; format (about 2.3GB), so I used &lt;a href="https://osmcode.org/osmium-tool/" rel="noopener noreferrer"&gt;osmium-tool&lt;/a&gt; to expand it into XML text (&lt;code&gt;.osm&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Download the pbf (2.3GB, binary)&lt;/span&gt;
curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; japan-latest.osm.pbf &lt;span class="se"&gt;\&lt;/span&gt;
  https://download.geofabrik.de/asia/japan-latest.osm.pbf

&lt;span class="c"&gt;# Convert to XML (text) with osmium → 51GB, 890 million lines&lt;/span&gt;
osmium &lt;span class="nb"&gt;cat &lt;/span&gt;japan-latest.osm.pbf &lt;span class="nt"&gt;-o&lt;/span&gt; japan-latest.osm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting file is UTF-8 text — an endless stream of &lt;code&gt;&amp;lt;node&amp;gt;&lt;/code&gt; elements carrying latitude/longitude.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;osm&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;"0.6"&lt;/span&gt; &lt;span class="na"&gt;generator=&lt;/span&gt;&lt;span class="s"&gt;"osmium/1.19.1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;bounds&lt;/span&gt; &lt;span class="na"&gt;minlat=&lt;/span&gt;&lt;span class="s"&gt;"20.08228"&lt;/span&gt; &lt;span class="na"&gt;minlon=&lt;/span&gt;&lt;span class="s"&gt;"122.5607"&lt;/span&gt; &lt;span class="na"&gt;maxlat=&lt;/span&gt;&lt;span class="s"&gt;"45.815403"&lt;/span&gt; &lt;span class="na"&gt;maxlon=&lt;/span&gt;&lt;span class="s"&gt;"154.4709"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;node&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"31236558"&lt;/span&gt; &lt;span class="na"&gt;version=&lt;/span&gt;&lt;span class="s"&gt;"5"&lt;/span&gt; &lt;span class="na"&gt;timestamp=&lt;/span&gt;&lt;span class="s"&gt;"2020-06-27T07:40:04Z"&lt;/span&gt; &lt;span class="na"&gt;lat=&lt;/span&gt;&lt;span class="s"&gt;"35.635073"&lt;/span&gt; &lt;span class="na"&gt;lon=&lt;/span&gt;&lt;span class="s"&gt;"139.768101"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Counting with &lt;code&gt;wc -l&lt;/code&gt; gives &lt;strong&gt;892,239,125 lines&lt;/strong&gt; — squarely in "no editor will ever open this" territory.&lt;/p&gt;




&lt;h2&gt;
  
  
  Measured Results (51GB, 892,239,125 lines, Apple Silicon Mac, external SSD)
&lt;/h2&gt;

&lt;p&gt;Measured using the benchmark harness bundled with UwView (&lt;code&gt;UwView.Bench&lt;/code&gt;).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Measured value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;File size&lt;/td&gt;
&lt;td&gt;51,254,526,392 bytes (about 48 GiB)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open + encoding detection&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Page-mode display (first 50 lines + 50 lines at the 50% position)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3 ms&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Index build (one sequential read)&lt;/td&gt;
&lt;td&gt;172.8 seconds (283 MB/s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total line count&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;892,239,125&lt;/strong&gt; (exact match with &lt;code&gt;wc -l&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkpoint count (index)&lt;/td&gt;
&lt;td&gt;3,485,310 entries ≒ &lt;strong&gt;26.6 MB&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed heap growth&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;33.3 MB&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GetLine random × 1000&lt;/td&gt;
&lt;td&gt;average 1.28 ms / p99 3.0 ms / max 5.7 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First-line fetch&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;?xml version='1.0' encoding='UTF-8'?&amp;gt;&lt;/code&gt; (2.9 ms)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Jump to the last line (line 892,239,125)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;&amp;lt;/osm&amp;gt;&lt;/code&gt; in &lt;strong&gt;0.006 ms&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoding switch&lt;/td&gt;
&lt;td&gt;3.4 ms (no index rebuild)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WorkingSet&lt;/td&gt;
&lt;td&gt;12,083 MB (includes mmap'd pages; reclaimable by the OS)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Clearing the "200 Million Line Wall" Without Issues
&lt;/h2&gt;

&lt;p&gt;What I most wanted to verify was whether things would hold up beyond the advertised 200 million lines. The short answer: no problems at all.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Accurate total line count:&lt;/strong&gt; the &lt;code&gt;892,239,125&lt;/code&gt; that UwView counted matched &lt;code&gt;wc -l&lt;/code&gt; exactly, without a single line off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instant jump to the end:&lt;/strong&gt; jumping to the last line (line 892,239,125, &lt;code&gt;&amp;lt;/osm&amp;gt;&lt;/code&gt;) took 0.006 ms. Once the index exists, jumping anywhere in the file is instantaneous.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory footprint stays flat:&lt;/strong&gt; for a 51GB file, what's actually resident is roughly 26.6MB of index plus about 33MB of managed heap. The file itself is never loaded into memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;UwView carries line numbers as a &lt;code&gt;long&lt;/code&gt; (64-bit integer), but 890 million comfortably fits even within the &lt;code&gt;int&lt;/code&gt; limit (about 2.14 billion). By design, line count is never going to be a bottleneck here.&lt;/p&gt;

&lt;p&gt;Note that the "WorkingSet 12GB" figure looks large, but it's the cache of file pages touched via mmap — non-resident memory that the OS reclaims on demand under memory pressure. It is not memory the app itself has allocated.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Difference from Synthetic Data — an Honest Look
&lt;/h2&gt;

&lt;p&gt;Let's line up the earlier synthetic 200-million-line data against this run's real 890-million-line data.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Synthetic 200M lines (5.1GB)&lt;/th&gt;
&lt;th&gt;Real data 890M lines (51GB)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Index build speed&lt;/td&gt;
&lt;td&gt;538 MB/s&lt;/td&gt;
&lt;td&gt;283 MB/s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GetLine random (average)&lt;/td&gt;
&lt;td&gt;0.005 ms&lt;/td&gt;
&lt;td&gt;1.28 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Jump to last line&lt;/td&gt;
&lt;td&gt;0.003 ms&lt;/td&gt;
&lt;td&gt;0.006 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Index size&lt;/td&gt;
&lt;td&gt;6.0 MB&lt;/td&gt;
&lt;td&gt;26.6 MB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I'll be upfront that GetLine is slower than on synthetic data (0.005 ms → 1.28 ms). Three reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Random reads on the external SSD are the limiting factor (an internal SSD would be faster).&lt;/li&gt;
&lt;li&gt;Real XML has widely varying line lengths, so cache efficiency is worse than with synthetic data.&lt;/li&gt;
&lt;li&gt;51GB doesn't fit entirely in memory (WorkingSet 12GB), so many reads end up hitting actual disk I/O.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Even so, it's still solidly in the single-digit-millisecond range, and scrolling and line-jumping feel plenty practical. The 283 MB/s index-build figure reflects a single sequential read of the full 51GB, and that number is entirely determined by storage speed.&lt;/p&gt;




&lt;h2&gt;
  
  
  Visible the Instant You Open It — the Strength of Page Mode
&lt;/h2&gt;

&lt;p&gt;Another point worth emphasizing: you can start browsing without waiting for the index build (about 3 minutes). Opening plus encoding detection took 12 ms, and the first full screen rendered in 3 ms. Even for a 51GB file, the moment you open it — much like the instant &lt;code&gt;less&lt;/code&gt; opens a huge file — the content is immediately visible in "byte-offset-based page mode," and once the index finishes building in the background, it quietly gets promoted to "line-number-based line mode."&lt;/p&gt;

&lt;p&gt;There's no need to brace yourself for "opening a huge file" — the content is visible the instant you double-click. That's the experience UwView most wants to convey.&lt;/p&gt;




&lt;h2&gt;
  
  
  So How Far Can It Go, Theoretically?
&lt;/h2&gt;

&lt;p&gt;With 890 million lines opening without trouble, I got curious: &lt;strong&gt;what's the theoretical upper limit on the number of lines?&lt;/strong&gt; I worked through my own code's data types and structures to calculate the ceiling, step by step.&lt;/p&gt;

&lt;h3&gt;
  
  
  The short answer first: the type limit is about 9.2 quintillion lines
&lt;/h3&gt;

&lt;p&gt;UwView tracks both line numbers and byte offsets as &lt;strong&gt;signed 64-bit integers (.NET's &lt;code&gt;long&lt;/code&gt;)&lt;/strong&gt; throughout. So the ceiling imposed by the data type itself is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;long.MaxValue = 9,223,372,036,854,775,807  (≈ 9.2×10^18 lines = about 9.2 quintillion lines)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's already a number with no real-world relevance, but the story doesn't end there. In practice, several walls appear well before you'd ever reach it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wall #1: File size
&lt;/h3&gt;

&lt;p&gt;Since byte offsets are also &lt;code&gt;long&lt;/code&gt;, the largest file UwView can handle is roughly &lt;strong&gt;8 EiB (exbibytes)&lt;/strong&gt;. And because the smallest possible line is just a single newline byte (&lt;code&gt;\n&lt;/code&gt;), the "upper limit on line count" and the "upper limit on file size" both land in the same 8 EiB neighborhood. Of course, in the real world the &lt;strong&gt;file system's own maximum file size&lt;/strong&gt; kicks in first (ext4 caps at 16TB per file; APFS and NTFS allow several EB, and so on).&lt;/p&gt;

&lt;h3&gt;
  
  
  Wall #2: The index structure
&lt;/h3&gt;

&lt;p&gt;To keep memory usage low, UwView uses a &lt;strong&gt;sparse index&lt;/strong&gt; that records a byte position only once every N lines (default N=256). These checkpoints are held in a &lt;code&gt;List&amp;lt;long&amp;gt;&lt;/code&gt; — backed internally by an array — but .NET arrays are capped at about &lt;strong&gt;2.14 billion elements (&lt;code&gt;Int32.MaxValue&lt;/code&gt;)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So at the default setting, the index array hits its ceiling at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2.14 billion × 256 ≈ 5.5×10^11 lines (about 550 billion lines)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can be relaxed by increasing &lt;code&gt;blockLines&lt;/code&gt; (N), but the index's &lt;strong&gt;memory footprint&lt;/strong&gt; becomes the binding constraint before that. Index size is roughly "line count ÷ 256 × 8 bytes"; in this test, 890 million lines produced a 26.6MB index. Extrapolating out to 550 billion lines would require about &lt;strong&gt;17GB&lt;/strong&gt; of RAM for the index alone — and in practice, this is roughly where the real-world limit sits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Wall #3: The real wall is "capacity"
&lt;/h3&gt;

&lt;p&gt;To sum up, there are three layers:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Limit&lt;/th&gt;
&lt;th&gt;Does it actually bind?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Limit imposed by the data type&lt;/td&gt;
&lt;td&gt;~9.2×10^18 lines (about 9.2 quintillion lines)&lt;/td&gt;
&lt;td&gt;Effectively unreachable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Effective limit imposed by the structure&lt;/td&gt;
&lt;td&gt;~550 billion lines by default (extendable via settings)&lt;/td&gt;
&lt;td&gt;Index RAM binds first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The real-world practical wall&lt;/td&gt;
&lt;td&gt;Storage capacity&lt;/td&gt;
&lt;td&gt;The realistic upper limit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The single biggest factor in the 890-million-line test was exactly this: file capacity binds before line count does. The 51GB file didn't fully fit in cache, and random reads dropped to millisecond-scale — but &lt;strong&gt;nothing broke&lt;/strong&gt;. That's the natural consequence of a design that never keeps the whole file resident in memory (mmap), renders only the visible lines, and looks up line positions through a small sparse index.&lt;/p&gt;




&lt;h2&gt;
  
  
  So what's the actual real-world limit?
&lt;/h2&gt;

&lt;p&gt;Reaching the type-imposed ceiling of 9.2×10^18 lines would require an 8 EiB-class file — far beyond anything a person could realistically provision. In practice, "the largest file you can actually get your hands on" is the real limit of the viewer.&lt;/p&gt;

&lt;p&gt;That said, on a &lt;strong&gt;practical&lt;/strong&gt; note: with as many as 890 million lines, building the index takes about three minutes and searches don't return results quickly. Something around 200 million lines is probably the comfortable sweet spot. The "up to 200 million lines" figure is only a rough guideline — in both the real-world test and the theoretical calculation, &lt;strong&gt;storage capacity becomes the limiting factor before line count does.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If anyone out there has an extremely large text file (hundreds of GB to TB scale) lying around, I'd genuinely love to hear where the limit actually lands when you open it in UwView.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Tested UwView on a real 51GB / 890-million-line dataset (OSM Japan as XML). It held up well beyond four times the advertised "200 million lines," with the total count matching &lt;code&gt;wc -l&lt;/code&gt; exactly and a jump to the last line taking just 0.006 ms.&lt;/li&gt;
&lt;li&gt;Resident memory is roughly 26.6MB of index plus 33MB of heap; the file itself is never resident. Browsing works in page mode from the instant it opens (12 ms / 3 ms) while the index builds in the background (about 3 minutes, 283 MB/s — storage-bound).&lt;/li&gt;
&lt;li&gt;Theoretically, the type limit is about 9.2 quintillion lines (&lt;code&gt;long&lt;/code&gt;) but effectively unreachable. Before that, the sparse index's array-element limit (about 550 billion lines by default) and index memory (about 17GB) bind first.&lt;/li&gt;
&lt;li&gt;Past the index wall, what ultimately matters is the simple reality of &lt;strong&gt;storage capacity&lt;/strong&gt;. The practical sweet spot is around 200 million lines.&lt;/li&gt;
&lt;li&gt;The real-data conclusion — file capacity binds before line count — holds up exactly the same way in the theoretical calculation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Related articles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-github-release-en/" rel="noopener noreferrer"&gt;UwView Goes Open Source on GitHub — Renewing a Windows 95-Era Large-File Text Viewer for 200 Million Lines and All Platforms&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://uvp.y42u.net/en/blog/uwview-pro-benchmark-3sizes-en/" rel="noopener noreferrer"&gt;UwView Pro Benchmark, Full Edition — a Serious Head-to-Head with klogg Across 3 Sizes × 3 Storage Types&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Sources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;amru195704/UwView (GitHub) &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;https://github.com/amru195704/UwView&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;OpenStreetMap Japan extract (Geofabrik) &lt;a href="https://download.geofabrik.de/asia/japan.html" rel="noopener noreferrer"&gt;https://download.geofabrik.de/asia/japan.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;osmium-tool &lt;a href="https://osmcode.org/osmium-tool/" rel="noopener noreferrer"&gt;https://osmcode.org/osmium-tool/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Int64.MaxValue Property (.NET) &lt;a href="https://learn.microsoft.com/dotnet/api/system.int64.maxvalue" rel="noopener noreferrer"&gt;https://learn.microsoft.com/dotnet/api/system.int64.maxvalue&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Array class limits (.NET) &lt;a href="https://learn.microsoft.com/dotnet/api/system.array" rel="noopener noreferrer"&gt;https://learn.microsoft.com/dotnet/api/system.array&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Premium Edition: UwView Pro (on sale now, Windows/macOS/Linux)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A commercial edition that lets you "instantly view and search huge files anytime, save the index so that from the second time on it opens instantly with line numbers, search up to about 9× faster, and store logs at about 1/9 the size while still opening them directly." One-time purchase $129 / $9 per month.&lt;br&gt;
→ &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/pro-en/&lt;/a&gt;&lt;br&gt;
(With UwView / UwView Pro, you can view and search the entire file the moment you open it — even on the very first open. The index is built in the background, and line numbers appear once it's complete. UwView Pro saves the index and compressed cache, so from the second open onward it opens instantly with line numbers already in place. Other viewers show only the head until indexing finishes, whereas UwView lets you view and search the whole file instantly from the first open.)&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;From the developer&lt;/strong&gt;: a list of my apps, Kindle books and open-source projects is on &lt;a href="https://github.com/amru195704" rel="noopener noreferrer"&gt;GitHub: amru195704&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A note&lt;/strong&gt;&lt;br&gt;
The information in this article is provided for reference purposes only, and its accuracy or completeness is not guaranteed. If you notice any errors or inaccuracies, please let us know in the comments and we will review and correct them.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>showdev</category>
      <category>performance</category>
      <category>opensource</category>
      <category>uwview</category>
    </item>
    <item>
      <title>An honest comparison with klogg [v1.1.1]: I list every row I'm losing on, too</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Sat, 25 Jul 2026 05:14:59 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/an-honest-comparison-with-klogg-v111-i-list-every-row-im-losing-on-too-2m7i</link>
      <guid>https://dev.to/_156a59a8566fe532e165/an-honest-comparison-with-klogg-v111-i-list-every-row-im-losing-on-too-2m7i</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fefjc0w5o0y6m4vklup64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fefjc0w5o0y6m4vklup64.png" alt=" " width="800" height="489"&gt;&lt;/a&gt;A while back I published a feature-comparison table between my large-file text viewer &lt;strong&gt;UwView&lt;/strong&gt; and the industry-standard log viewer &lt;strong&gt;&lt;a href="https://klogg.filimonov.dev/" rel="noopener noreferrer"&gt;klogg&lt;/a&gt;&lt;/strong&gt;. One rule: &lt;strong&gt;list every row I'm losing on, too.&lt;/strong&gt; That table reflected the free version (UVF) at v1.0.0. Since then, &lt;strong&gt;v1.1 → v1.1.1&lt;/strong&gt; filled in a number of those "losing" rows, so here's the &lt;strong&gt;complete edition as of v1.1.1&lt;/strong&gt; — three columns (klogg, free &lt;strong&gt;UwView (UVF)&lt;/strong&gt;, and paid &lt;strong&gt;UwView Pro (UVP)&lt;/strong&gt;), same items, status brought up to date. I still don't hide the rows where klogg wins.&lt;/p&gt;

&lt;p&gt;Legend: ✅ = yes / 🔶 = partial or limited / ❌ = no (&lt;a href="https://github.com/amru195704/UwView/issues/1" rel="noopener noreferrer"&gt;planned&lt;/a&gt;) / — = not applicable. Baseline: klogg 24.11.0, UVF v1.1.1, and an internal UVP build.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Performance &amp;amp; core (where UwView leads)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;klogg&lt;/th&gt;
&lt;th&gt;UVF 1.1.1&lt;/th&gt;
&lt;th&gt;UVP 1.1.1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Instant open of huge files (browse the whole file before indexing finishes)&lt;/td&gt;
&lt;td&gt;❌ Head only until indexing completes&lt;/td&gt;
&lt;td&gt;✅ Instant page-mode display&lt;/td&gt;
&lt;td&gt;✅ Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Persistent index (reopening is instant)&lt;/td&gt;
&lt;td&gt;❌ Re-indexes every time&lt;/td&gt;
&lt;td&gt;❌ Rebuilds every time&lt;/td&gt;
&lt;td&gt;✅ &lt;code&gt;.uwvz&lt;/code&gt; (from a few ms)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast search via compressed cache&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (3–9× vs klogg, measured)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Archive workflow (delete original, keep ~1/9 size)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ Checksum-protected&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automatic Japanese encoding detection (Shift-JIS/EUC-JP)&lt;/td&gt;
&lt;td&gt;❌ Manual&lt;/td&gt;
&lt;td&gt;✅ Auto + manual switch&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Largest scale verified&lt;/td&gt;
&lt;td&gt;~1B lines (claimed)&lt;/td&gt;
&lt;td&gt;892M lines / 51 GB (measured)&lt;/td&gt;
&lt;td&gt;Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser (WASM) build&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ (bonus)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JA/EN UI switch&lt;/td&gt;
&lt;td&gt;❌ English only&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Opening a huge file and moving freely through the whole thing right away is clearly where UVF/UVP lead, and &lt;strong&gt;Pro is another order of magnitude ahead on reopening, search, and storage size&lt;/strong&gt; (see the &lt;a href="https://uvp.y42u.net/en/blog/uwview-pro-benchmark-3sizes-en/" rel="noopener noreferrer"&gt;measured 3-size benchmark&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Search, filtering &amp;amp; color coding (big progress in v1.1 / v1.1.1)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;klogg&lt;/th&gt;
&lt;th&gt;UVF 1.1.1&lt;/th&gt;
&lt;th&gt;UVP 1.1.1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Regex search&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ literal/regex&lt;/td&gt;
&lt;td&gt;✅ + fast icase path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Results in a separate view + jump to text&lt;/td&gt;
&lt;td&gt;✅ Bottom pane&lt;/td&gt;
&lt;td&gt;✅ Popup (auto-shown)&lt;/td&gt;
&lt;td&gt;✅ Per tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context lines around results (±N)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ ±1&lt;/td&gt;
&lt;td&gt;✅ ±1000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Save results to a separate file (with original line numbers)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Match highlight + minimap distribution&lt;/td&gt;
&lt;td&gt;🔶 Emphasis only&lt;/td&gt;
&lt;td&gt;✅ Minimap + click-to-jump&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-keyword color highlighter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;v1.1&lt;/strong&gt; (32 colors, regex capture groups, &lt;strong&gt;7 bundled presets&lt;/strong&gt;, &lt;code&gt;.uwvhl&lt;/code&gt; import/export, &lt;strong&gt;per tab&lt;/strong&gt;)&lt;/td&gt;
&lt;td&gt;✅ Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Right-click instant coloring of a selected word&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;v1.1.1&lt;/strong&gt; (right-click → color, 3-tier word selection)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Saved predefined filters / search history&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;v1.1&lt;/strong&gt; (50-entry history, ★ save)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In-view incremental search (QuickFind, Ctrl+F)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;🔶 Mostly covered by next/previous&lt;/td&gt;
&lt;td&gt;🔶 Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boolean search expressions (AND/OR)&lt;/td&gt;
&lt;td&gt;🔶 via regex&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The "log-analysis toolbox" — color highlighting, search history, quick coloring — where klogg had the edge in v1.0 is now &lt;strong&gt;almost entirely filled in&lt;/strong&gt;. Bundled presets went from 5 (v1.1) to 7 after adding &lt;strong&gt;GeoJSON / KML&lt;/strong&gt; in v1.1.1. QuickFind isn't implemented yet, but next/previous (&lt;code&gt;&amp;lt; &amp;gt;&lt;/code&gt;) covers most of the need, so it's low priority.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Display &amp;amp; operation
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;klogg&lt;/th&gt;
&lt;th&gt;UVF 1.1.1&lt;/th&gt;
&lt;th&gt;UVP 1.1.1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Multi-file tabs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Drag &amp;amp; drop / multi-select&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bookmarks (marks)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ Toggle / prev-next / minimap&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Line selection (drag) → copy/save&lt;/td&gt;
&lt;td&gt;🔶&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;v1.1&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rectangular (column) selection &amp;amp; copy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;v1.1&lt;/strong&gt; (Pro only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Line-number display&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scratchpad (base64/JSON/XML formatting workspace)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ → planned&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Line-wrap display&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ → planned&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. Monitoring (tail) &amp;amp; operations (klogg's remaining strengths)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;klogg&lt;/th&gt;
&lt;th&gt;UVF 1.1.1&lt;/th&gt;
&lt;th&gt;UVP 1.1.1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Follow appended writes (&lt;code&gt;tail -f&lt;/code&gt; equivalent)&lt;/td&gt;
&lt;td&gt;✅ Follow mode&lt;/td&gt;
&lt;td&gt;✅ Incremental index + auto-scroll&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session restore (reopen the previous set of files)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;v1.1.1&lt;/strong&gt; (near previous scroll position)&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;v1.1.1&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recent files, favorites, start screen&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Recently used&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;v1.1.1&lt;/strong&gt; (last 15, ★ favorites)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auto-updating search results while following&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ → planned (high priority)&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Per-file state restore (marks, encoding, Follow)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌ → planned (per-file)&lt;/td&gt;
&lt;td&gt;🔶 Index persistent; marks etc. ❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Log rotation / truncation handling&lt;/td&gt;
&lt;td&gt;🔶&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Around "resuming your work," v1.1.1's session restore, recent files, and favorites filled in most of the gap. What remains is &lt;strong&gt;auto-updating search tied to Follow&lt;/strong&gt; and &lt;strong&gt;fine-grained per-file state restore&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Distribution &amp;amp; ecosystem (where klogg's overall strength counts)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;klogg&lt;/th&gt;
&lt;th&gt;UVF 1.1.1&lt;/th&gt;
&lt;th&gt;UVP 1.1.1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Price / license&lt;/td&gt;
&lt;td&gt;Free, GPL (OSS)&lt;/td&gt;
&lt;td&gt;Free, PolyForm Internal Use (source available)&lt;/td&gt;
&lt;td&gt;Paid (commercial, on sale)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supported OS&lt;/td&gt;
&lt;td&gt;Win/Mac/Linux&lt;/td&gt;
&lt;td&gt;Win/Mac/Linux + WASM&lt;/td&gt;
&lt;td&gt;Win/Mac/Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Package distribution (Homebrew/Chocolatey/winget…)&lt;/td&gt;
&lt;td&gt;✅ Extensive&lt;/td&gt;
&lt;td&gt;🔶 GitHub Releases / Vector&lt;/td&gt;
&lt;td&gt;🔶 Polar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS shell integration / portable build&lt;/td&gt;
&lt;td&gt;✅ (Windows)&lt;/td&gt;
&lt;td&gt;❌ → planned&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Track record / user base&lt;/td&gt;
&lt;td&gt;✅ 10+ years in the glogg lineage&lt;/td&gt;
&lt;td&gt;🔶 Still building&lt;/td&gt;
&lt;td&gt;🔶&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encoding coverage (Chinese, Korean, Cyrillic…)&lt;/td&gt;
&lt;td&gt;✅ Broad (Qt base)&lt;/td&gt;
&lt;td&gt;🔶 UTF-8/Shift-JIS/EUC-JP/UTF-16 → planned&lt;/td&gt;
&lt;td&gt;🔶&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Distribution, track record, and encoding breadth are where klogg is still clearly ahead. Those don't get filled in overnight, so I'm leaving them exactly as they are — honestly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rows filled in vs. still remaining (v1.0 → v1.1.1)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Filled in&lt;/strong&gt; (klogg's edge → UVF now ✅ too): multi-keyword color highlighter, right-click instant coloring, search history / predefined filters, line selection → copy/save, session restore, recent files / favorites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Still remaining&lt;/strong&gt; (klogg still ahead): auto-updating search while following, per-file state restore, QuickFind (substitutable with next/previous), Boolean search, Scratchpad, line-wrap, package distribution / shell integration, track record / encoding breadth.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I don't hide the remaining items — they're all listed openly in the &lt;strong&gt;&lt;a href="https://github.com/amru195704/UwView/issues/1" rel="noopener noreferrer"&gt;GitHub roadmap issue&lt;/a&gt;&lt;/strong&gt;. I'll work through them top-down, not by copying klogg outright, but by designing each in whatever shape I find easiest to use myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Performance and the huge-file experience remain UVF/UVP's strength.&lt;/strong&gt; Pro takes it another order of magnitude further (persistent index, compressed search, 1/9 storage).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The log-analysis toolbox&lt;/strong&gt; gained color highlighting, quick coloring, search history, and restore features in v1.1/v1.1.1 — closing the gap with klogg considerably.&lt;/li&gt;
&lt;li&gt;klogg's remaining advantages: Follow-linked search, per-file state restore, distribution, track record. All on the public roadmap.&lt;/li&gt;
&lt;li&gt;If your work is routine log analysis and you value distribution and track record, klogg is still a solid choice. If you want to open and read huge files fast, auto-detect Japanese log encodings, and track things by color, give UwView a try — it's free.&lt;/li&gt;
&lt;li&gt;And if a huge log is eating your disk and you want it &lt;strong&gt;compressed for storage while staying searchable at speed, give &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;UwView Pro&lt;/a&gt; a look&lt;/strong&gt; — persistent index, compressed-cache search, and ~1/9 storage make both reopening and searching a step faster (all OS, $129 one-time / $9 per month).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not a "klogg killer" — different tools for different jobs. I respect klogg and compare against it honestly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full write-up (original): &lt;a href="https://uvp.y42u.net/en/blog/uwview-klogg-feature-comparison-v111-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/blog/uwview-klogg-feature-comparison-v111-en/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;UwView Pro ($129 one-time / $9 per month): &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/pro-en/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source / roadmap: &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;https://github.com/amru195704/UwView&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Browser demo (no install): &lt;a href="https://amru195704.github.io/UwView/" rel="noopener noreferrer"&gt;https://amru195704.github.io/UwView/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>I benchmarked my log viewer against klogg at 3/10/48 GB — the second open is the real win</title>
      <dc:creator>y4u</dc:creator>
      <pubDate>Fri, 24 Jul 2026 13:33:45 +0000</pubDate>
      <link>https://dev.to/_156a59a8566fe532e165/i-benchmarked-my-log-viewer-against-klogg-at-31048-gb-the-second-open-is-the-real-win-1ib0</link>
      <guid>https://dev.to/_156a59a8566fe532e165/i-benchmarked-my-log-viewer-against-klogg-at-31048-gb-the-second-open-is-the-real-win-1ib0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqybrpmqjia33d9s3wbjl.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqybrpmqjia33d9s3wbjl.gif" alt=" " width="640" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you work with logs, you know the wait: opening a multi-gigabyte file takes minutes before you can search. I built a large-file viewer, &lt;strong&gt;UwView&lt;/strong&gt;, plus a paid &lt;strong&gt;UwView Pro (UVP)&lt;/strong&gt;, to cut the &lt;em&gt;re-open&lt;/em&gt; wait to near zero. I ran a full &lt;strong&gt;3 sizes × 3 storage tiers = 9-cell&lt;/strong&gt; benchmark against klogg. Everything below is measured, with conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test setup (all of it)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Files&lt;/strong&gt; (OpenStreetMap Japan, real data): &lt;strong&gt;2.95 GB / 100M lines&lt;/strong&gt;, &lt;strong&gt;9.4 GB / 100M lines&lt;/strong&gt;, &lt;strong&gt;47.73 GB / 892,239,125 lines&lt;/strong&gt;. (The largest is 51,254,526,392 bytes = &lt;strong&gt;47.73 GiB&lt;/strong&gt;; macOS shows it as &lt;strong&gt;51.25 GB&lt;/strong&gt; in SI. Same file.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Storage&lt;/strong&gt;: USB HDD (measured 0.10 GB/s) / USB SSD (0.41 GB/s) / internal SSD (3.29 GB/s) — a &lt;strong&gt;33×&lt;/strong&gt; raw-bandwidth spread.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Machine&lt;/strong&gt;: MacBook Air, Apple M4 (10 cores), 32 GB RAM, macOS 26.3.1; &lt;strong&gt;klogg 24.11.0&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt;: average of &lt;strong&gt;10 consecutive words&lt;/strong&gt; (major Japanese city names), cold read included; the 48 GB row is a single run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation&lt;/strong&gt;: hit counts match klogg &lt;strong&gt;exactly&lt;/strong&gt; in every cell (e.g., "Tokyo" in 10 GB = 1,211 hits).&lt;/li&gt;
&lt;li&gt;Note: klogg timings are read off the GUI by eye, so they're &lt;strong&gt;approximate&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The honest part first (this is easy to get wrong):&lt;/strong&gt; UwView lets you &lt;strong&gt;view the entire file the moment you open it — on the &lt;em&gt;first&lt;/em&gt; open too&lt;/strong&gt;, not just the second. (klogg shows only the head until indexing finishes; that's the real experience gap.) What &lt;em&gt;does&lt;/em&gt; take time on the first open is building the &lt;strong&gt;index&lt;/strong&gt;, and that time is on par with other tools — you read the file once, and physics is physics — but indexing runs in the background while you're already browsing and searching. On the &lt;strong&gt;second&lt;/strong&gt; open the index is already saved, so there's no indexing at all: it's instant.&lt;/p&gt;

&lt;p&gt;The "open" times below measure, for &lt;strong&gt;UVP, the time to build the index&lt;/strong&gt;, and for &lt;strong&gt;klogg, the time until the text is actually viewable&lt;/strong&gt; (klogg shows only the head until indexing finishes). Measuring UVP by &lt;em&gt;time-to-view&lt;/em&gt; would be near-instant — on the order of &lt;strong&gt;1,500× vs klogg&lt;/strong&gt; — which makes no meaningful bar chart, so I deliberately handicap UVP with its &lt;strong&gt;index-build&lt;/strong&gt; time instead. Values are summed over two opens of the same file (klogg rebuilds its index on every open ≈ ×2; UVP's second open is tens of milliseconds ≈ 0). Viewing itself is instant from UVP's first open.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 9-cell table (open → search)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Size · Storage&lt;/th&gt;
&lt;th&gt;klogg open (2×)&lt;/th&gt;
&lt;th&gt;UVP open (2×)&lt;/th&gt;
&lt;th&gt;klogg search&lt;/th&gt;
&lt;th&gt;UVP search&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3 GB · internal SSD&lt;/td&gt;
&lt;td&gt;~4s&lt;/td&gt;
&lt;td&gt;1.4s&lt;/td&gt;
&lt;td&gt;~2s&lt;/td&gt;
&lt;td&gt;0.40s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 GB · USB SSD&lt;/td&gt;
&lt;td&gt;~16s&lt;/td&gt;
&lt;td&gt;8.3s&lt;/td&gt;
&lt;td&gt;~2s&lt;/td&gt;
&lt;td&gt;0.43s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 GB · USB HDD&lt;/td&gt;
&lt;td&gt;~94s&lt;/td&gt;
&lt;td&gt;51.3s&lt;/td&gt;
&lt;td&gt;~2s&lt;/td&gt;
&lt;td&gt;0.72s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3 GB subtotal → ratio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~114s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;61.0s → ~1.9×&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~6s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.55s → ~3.9×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 GB · internal SSD&lt;/td&gt;
&lt;td&gt;~7s&lt;/td&gt;
&lt;td&gt;4.9s&lt;/td&gt;
&lt;td&gt;~2s&lt;/td&gt;
&lt;td&gt;1.20s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 GB · USB SSD&lt;/td&gt;
&lt;td&gt;~48s&lt;/td&gt;
&lt;td&gt;27.8s&lt;/td&gt;
&lt;td&gt;~3s&lt;/td&gt;
&lt;td&gt;1.14s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10 GB · USB HDD&lt;/td&gt;
&lt;td&gt;~220s&lt;/td&gt;
&lt;td&gt;155.8s&lt;/td&gt;
&lt;td&gt;~3s&lt;/td&gt;
&lt;td&gt;2.41s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10 GB subtotal → ratio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~275s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;188.5s → ~1.5×&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~8s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.75s → ~1.7×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 GB · internal SSD&lt;/td&gt;
&lt;td&gt;~30s&lt;/td&gt;
&lt;td&gt;23.3s&lt;/td&gt;
&lt;td&gt;~17.5s&lt;/td&gt;
&lt;td&gt;5.1s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 GB · USB SSD&lt;/td&gt;
&lt;td&gt;~220s&lt;/td&gt;
&lt;td&gt;138.5s&lt;/td&gt;
&lt;td&gt;~128s&lt;/td&gt;
&lt;td&gt;14.3s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48 GB · USB HDD&lt;/td&gt;
&lt;td&gt;~1090s&lt;/td&gt;
&lt;td&gt;637s&lt;/td&gt;
&lt;td&gt;~585s&lt;/td&gt;
&lt;td&gt;74.8s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;48 GB subtotal → ratio&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~1340s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;798.8s → ~1.7×&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~730s&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;94.2s → ~7.7×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnwojhg5hxwf9sch210bx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnwojhg5hxwf9sch210bx.png" alt=" " width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1iljrc4w97zsuxye4aop.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1iljrc4w97zsuxye4aop.png" alt=" " width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the table
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open (= indexing time; viewing is instant on either open):&lt;/strong&gt; even summed over two opens, UVP is &lt;strong&gt;1.5–1.9×&lt;/strong&gt; faster — and every further open adds only to klogg's side (N opens → klogg ×N; UVP stays near its first). Look at &lt;em&gt;first-open indexing&lt;/em&gt; alone and UVP is 10–30% slower (it's also building the compressed cache); by the second open it's already ahead in every cell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search:&lt;/strong&gt; for RAM-fitting sizes (3–10 GB), &lt;strong&gt;~1.7–3.9×&lt;/strong&gt; — but klogg also returns in seconds there, so it's fine either way. Above RAM, at &lt;strong&gt;48 GB, ~7.7×&lt;/strong&gt;: klogg spends minutes per search (about 10 minutes on the USB HDD), which is a different experience. Regex is similar (10 GB, 10-word average: UVP 1.8–1.9 s).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Archive workflow (.uwvz)
&lt;/h2&gt;

&lt;p&gt;You can delete the original and keep only a compressed cache (&lt;code&gt;.uwvz&lt;/code&gt;, checksum-protected), then browse and search it directly. Disk footprint drops to &lt;strong&gt;1/7–1/13&lt;/strong&gt;: 3 GB→0.23 GB, 10 GB→1.29 GB, &lt;strong&gt;48 GB→5.32 GB&lt;/strong&gt; — and search still returns in seconds to ~75 s even on slow storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's actually doing
&lt;/h2&gt;

&lt;p&gt;One idea: &lt;em&gt;since you read the whole file on the first open anyway, build a compressed cache + index while you're at it, and never read the raw file in full again.&lt;/em&gt; It doesn't fight disk I/O physics — it &lt;strong&gt;reduces the number of bytes read&lt;/strong&gt;. A 30-year-old large-viewer design, re-solved with a fast CPU, lots of RAM, and zstd.&lt;/p&gt;

&lt;h2&gt;
  
  
  On klogg (with respect)
&lt;/h2&gt;

&lt;p&gt;klogg is an excellent, established tool with a strong log-analysis toolbox. UVP is tuned for the &lt;em&gt;open-and-read&lt;/em&gt; experience of huge files and for compressed archival. My comparison article lists klogg's advantages honestly too. Different tools for different jobs — not a "klogg killer."&lt;/p&gt;

&lt;p&gt;macOS first (Windows/Linux coming). Free build + a browser WASM demo to try instantly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full write-up &amp;amp; charts (original): &lt;a href="https://uvp.y42u.net/blog/uwview-pro-benchmark-3sizes/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/blog/uwview-pro-benchmark-3sizes/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Product ($129 one-time / $9 per month): &lt;a href="https://uvp.y42u.net/en/pro-en/" rel="noopener noreferrer"&gt;https://uvp.y42u.net/en/pro-en/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Source / roadmap: &lt;a href="https://github.com/amru195704/UwView" rel="noopener noreferrer"&gt;https://github.com/amru195704/UwView&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Demo: &lt;a href="https://amru195704.github.io/UwView/" rel="noopener noreferrer"&gt;https://amru195704.github.io/UwView/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>performance</category>
      <category>dotnet</category>
      <category>devops</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
