Windows Preview available. Pro checkout is not open yet. Plans and capability details →

Measured 2026-10-20 · synthetic data only

Opening a 15 GB CSV
is only the beginning.

We tested the same source in real desktop applications and checked the last record. Here are opening, complete access, query and resource results—with the work behind each number made explicit.

One source. Different jobs.

15,000,000,000 bytes, 29,296,874 data records and 16 fields. All values are synthetic. No private records, screenshots or research statistics were used.

EmEditor was faster for complete-source access and literal counting on this fixture. RowCove returns structured filter results and persistent source-row locators. Modern CSV Free opened the complete source, but its native column filter required Premium. These are vendor-run observations on one workstation, not a universal ranking.

1. First records in a real RowCove window

Installed Windows x64 Release Preview 0.1.0-preview.20261020.1. Automatic header detection passed without manual correction, including quoted multiline records and exact large integer text. Timings include automated import confirmation and a ready grid; human file-picker and decision time are excluded.

On a narrow screen, focus the table and scroll horizontally for all columns.

Preview first 100 records; three runs
WorkflowMedianObserved rangeVerified outcome
Fresh app launch → ready grid0.968 s0.896 s–0.979 sHeader row excluded; first data ID 0
App already running → ready grid0.330 s0.322 s–0.346 sSingle-instance file handoff
Import confirmation → ready grid0.238 s0.202 s–0.251 sSubset of fresh launch timing

Keyboard navigation and scrolling to the 100-record Preview boundary passed. The first viewport rendered up to 30 rows. Preview does not count or index the whole file. Pro first interactive viewport after import confirmation: 0.249 s median, with a keyboard selection change verified while indexing continued. An independently verified first painted-frame time was not collected for the other desktop products.

2. Complete-source access and queries

Every desktop opening result below was followed by verification of source ID 29296873 at the end of the file. All measured queries matched 292,969 records containing symbol DEMO-42.

On a narrow screen, focus the table and scroll horizontally for all columns.

Same 15 GB source; distinct native workflows
Application / editionComplete-source accessQueryWork and timing scope
RowCove · signed sandbox Pro20.174 s median11.047 s median3 runs. After import confirmation: full CSV record index; then exact symbol filter and persistent matching-row locators.
EmEditor 26.3.0 · Professional trial4.439 s median1.119 s median3 runs. Launch through native GetLines + last-line proof; native Find Count of literal ,DEMO-42,. Count-only output.
Modern CSV 2.4.4 · Free44.23–45.44 s readiness intervalsNot measured · Premium required2 runs. Native file-open confirmation through idle/responsive readiness; later final-row verification. Read-only enabled; auto-fit disabled.

RowCove full index range: 19.341 s–21.554 s; first filter: 10.959 s–11.085 s. The identical cached filter returned in 8 ms median (8–9 ms). This cached lookup is not another complete scan. EmEditor full access: 3.413 s–4.838 s; count: 1.104 s–1.140 s.

EmEditor uses documented native macros; its open-return marker alone does not prove a painted, interactive viewport, so it is not shown as first-screen time. Modern CSV readiness uses about 200 ms CPU/Responding samples and a one-second quiet window; it is a readiness interval, not precise first paint. Its column filter explicitly required Premium; no license was available. Automation-contaminated exploratory runs were discarded. No Modern CSV query result or timeout is used as a performance claim.

3. Memory and temporary disk belong in the comparison

Sampled peaks across each measured opening/query sequence; Modern CSV samples stop after successful final-row proof and before query experiments. RSS includes mapped source pages and shared processes; private commit is separately allocated process memory. Neither measure alone describes all RAM costs.

On a narrow screen, focus the table and scroll horizontally for all columns.

Native process-tree sampled peaks; observed ranges
ApplicationPrivate commitResident working set / RSSTracked temporary/cache growth
RowCove Pro505.4 MiB–511.9 MiB718.1 MiB–721.8 MiB5.3 MiB–9.8 MiB
EmEditor Professional trial48.9 MiB–89.0 MiB14351.2 MiB–14393.2 MiB0 bytes observed
Modern CSV Free · opening only1485.4 MiB–1486.6 MiB1299.3 MiB–1301.2 MiB0.0 MiB–0.0 MiB

EmEditor maps approximately 14 GiB of source pages into its resident working set in these runs; its low private commit must not be presented as its entire memory footprint. Disk figures measure logical file-length growth in dedicated TEMP and application cache roots, not all machine writes or allocated filesystem blocks. RowCove Pro retained about 5.35 MiB of index/query cache after each run. Sampled transient cache publication reached about 9.82 MiB.

What this test helped us fix

The fixture exposed a quoted-multiline header detection bug and an unnecessary full-table conversion before a first CSV filter. The header detector now reads logical CSV records. First unsorted filters stream the source and retain matching-row locators; a valid existing columnar cache is reused, and sorting can still prepare columnar data.

On this same fixture, the old first-filter policy took 131.698 s in one baseline run and grew tracked scratch/cache by 6.38 GB. After the change, three first-filter runs had a 11.047 s median and sampled peak scratch/cache of 5.3 MiB–9.8 MiB. This is a within-product regression result, not a speedup claim over another editor.

4. Code-based readers: first 100 records

These API calls return data frames or rows without desktop rendering. All 16 fields, default type inference, validated IDs and a quoted multiline value. A fresh Python process per run; operation time starts after library import. Different type-detection defaults apply.

On a narrow screen, focus the table and scroll horizontally for all columns.

Bounded API reads; three runs per reader
ReaderOperation medianFresh process medianOperation range
pandas 3.0.60.005 s0.498 s0.005 s–0.009 s
DuckDB 1.5.60.382 s0.654 s0.382 s–0.392 s
Polars 2.0.00.010 s0.401 s0.006 s–0.038 s

5. Code-based readers: scan every record

Projected streaming aggregation: count all records and sum row_id, validated against the generator. This is different from the RowCove record index and EmEditor line-access tasks above; no cross-task throughput ranking is inferred.

On a narrow screen, focus the table and scroll horizontally for all columns.

Complete-source count + sum(row_id); three runs
ReaderOperation medianObserved rangeScope
pandas 3.0.641.218 s39.772 s–42.486 s29,296,874 validated records
DuckDB 1.5.610.117 s8.731 s–10.198 s29,296,874 validated records
Polars 2.0.011.175 s10.992 s–17.624 s29,296,874 validated records

Test conditions and limits

Workstation
Intel Core i9-13900HX, 32 logical CPUs, 31.7 GiB RAM. Windows 10.0.26200 x64. Samsung NVMe SSD, NTFS D:.
Fixture
UTF-8, comma delimiter, 16 columns; mostly 512-byte records. Deterministic mock values, quoted commas and embedded newlines. 15.00 decimal GB / 13.97 GiB. Uncompressed.
Cache and repetitions
OS caches uncontrolled and never flushed; no cold-disk claim. Three RowCove, EmEditor and library runs; two Modern CSV opening runs. RowCove Pro used a fresh application cache per run. Background OS activity is uncontrolled.
Builds and editions
Preview is the publicly downloadable unsigned Windows Release with signed updater artifacts. Full-file RowCove measurements use an internal Release with a valid signed sandbox Pro entitlement, not a mock unlock; that binary is not distributed. EmEditor used its Professional trial. Modern CSV used Free with read-only and auto-fit settings stated above.
Not established
No TB-scale, compressed-source, different-machine or universal fastest-product claim. Full export/save and Modern CSV Premium filtering were not measured. Excel was not timed; its worksheet row limit is a capacity fact, not a benchmark.
Per-run evidence and fixture fingerprint
{
  "fixtureSha256": "9b6f972a3dbd706ee6a0ebe38c043e8679de352803ed3fcf611228c668d05238",
  "desktop": {
    "freshProcessMs": [
      978.97,
      967.73,
      896.11
    ],
    "alreadyRunningMs": [
      345.58,
      321.59,
      330.42
    ],
    "confirmToGridMs": [
      238.14,
      250.71,
      201.67
    ]
  },
  "native": {
    "rowcove": {
      "edition": "Signed sandbox Pro; Release; no mock entitlement",
      "runs": [
        {
          "confirmToFirstInteractive": 245,
          "confirmToCompleteIndex": 19341,
          "firstQuery": 11047,
          "repeatQuery": 8,
          "lastRecordValidated": true,
          "matches": 292969,
          "peakPrivateCommitBytes": 529936384,
          "peakRssBytes": 752959488,
          "peakScratchGrowthBytes": 5606949
        },
        {
          "confirmToFirstInteractive": 249,
          "confirmToCompleteIndex": 20174,
          "firstQuery": 11085,
          "repeatQuery": 9,
          "lastRecordValidated": true,
          "matches": 292969,
          "peakPrivateCommitBytes": 531447808,
          "peakRssBytes": 753926144,
          "peakScratchGrowthBytes": 10293931
        },
        {
          "confirmToFirstInteractive": 259,
          "confirmToCompleteIndex": 21554,
          "firstQuery": 10959,
          "repeatQuery": 8,
          "lastRecordValidated": true,
          "matches": 292969,
          "peakPrivateCommitBytes": 536776704,
          "peakRssBytes": 756809728,
          "peakScratchGrowthBytes": 5606949
        }
      ],
      "query": "symbol equals DEMO-42; exact CSV streaming predicate plus persistent matching-source-row locators; native Tauri command; 292,969 matches"
    },
    "emeditor": {
      "version": "26.3.0",
      "edition": "Professional 7-day trial; read-only /r; separate process /sp",
      "runs": [
        {
          "nativeOpenReturnMs": 620.53,
          "fullAccessMs": 3412.53,
          "queryMs": 1119,
          "matches": 292969,
          "lastRecordValidated": true,
          "peakPrivateCommitBytes": 51314688,
          "peakRssBytes": 15048339456,
          "peakScratchGrowthBytes": 0
        },
        {
          "nativeOpenReturnMs": 312.85,
          "fullAccessMs": 4837.85,
          "queryMs": 1104,
          "matches": 292969,
          "lastRecordValidated": true,
          "peakPrivateCommitBytes": 92958720,
          "peakRssBytes": 15089397760,
          "peakScratchGrowthBytes": 0
        },
        {
          "nativeOpenReturnMs": 306.57,
          "fullAccessMs": 4438.57,
          "queryMs": 1140,
          "matches": 292969,
          "lastRecordValidated": true,
          "peakPrivateCommitBytes": 93368320,
          "peakRssBytes": 15092342784,
          "peakScratchGrowthBytes": 0
        }
      ],
      "query": "Documented native Find Count macro for case-sensitive literal ,DEMO-42,; same matching set on this fixture, count-only output, not a structured result index"
    },
    "moderncsv": {
      "version": "2.4.4",
      "edition": "Free; read-only true; auto-fit column width false",
      "runs": [
        {
          "openingReadyLowerMs": 44231,
          "openingReadyUpperMs": 45275,
          "lastRecordValidated": true,
          "sampleCount": 531,
          "peakPrivateCommitBytes": 1557565440,
          "peakRssBytes": 1362436096,
          "peakScratchGrowthBytes": 23
        },
        {
          "openingReadyLowerMs": 44397,
          "openingReadyUpperMs": 45443,
          "lastRecordValidated": true,
          "sampleCount": 736,
          "peakPrivateCommitBytes": 1558769664,
          "peakRssBytes": 1364361216,
          "peakScratchGrowthBytes": 0
        }
      ],
      "query": {
        "status": "not-measured",
        "reason": "Native column filtering requires Premium; no Premium license available. No query timing is claimed."
      },
      "readiness": "CPU idle and native Responding for one second, sampled about 200 ms; a readiness interval/proxy, not first painted frame. Subsequent native navigation/copy verified final row. Resource samples stop before query experiments."
    },
    "optimization": {
      "baselineRuns": 1,
      "afterRuns": 3,
      "beforeFirstQueryMs": 131698,
      "beforeResources": {
        "peakPrivateCommitBytes": 1144283136,
        "peakRssBytes": 1261236224,
        "peakScratchGrowthBytes": 6383215906
      },
      "scope": "Same synthetic source and native signed Pro Release. Baseline first UTF-8 filter eagerly built a full columnar cache; revised policy streams first filters and reuses result locators. Full sorting can still prepare columnar data."
    }
  },
  "libraries": [
    {
      "name": "pandas",
      "version": "3.0.6",
      "first100": [
        8.72,
        4.8,
        4.59
      ],
      "scan": [
        42485.71,
        39772.25,
        41218.49
      ]
    },
    {
      "name": "duckdb",
      "version": "1.5.6",
      "first100": [
        382.11,
        392.05,
        382.15
      ],
      "scan": [
        10198.42,
        10117.16,
        8731.23
      ]
    },
    {
      "name": "polars",
      "version": "2.0.0",
      "first100": [
        37.64,
        10.12,
        5.89
      ],
      "scan": [
        17624.35,
        10992.07,
        11174.5
      ]
    }
  ]
}

Download the measured results and methodology (JSON)