ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

hucre 流式读写完全指南:百万行 Excel 如何只占几十 MB 内存(附实测数据)

hucre 流式读写完全指南:百万行 Excel 如何只占几十 MB 内存(附实测数据) hucre 流式读写完全指南百万行 Excel 如何只占几十 MB 内存附实测数据【免费下载链接】hucreZero-dependency spreadsheet engine. Read write XLSX, CSV, ODS. Pure TypeScript, works everywhere.项目地址: https://gitcode.com/gh_mirrors/hu/hucrehucre是一个零依赖的电子表格引擎支持读写 XLSX、CSV、ODS 等多种格式。它的流式读写能力是处理超大 Excel 的核心武器——用streamXlsxRows逐行读取、writeXlsxStream边生成边写出内存占用可以稳定在几十 MB轻松扛住百万行级别的表格。本文带你理解流式原理、选对 API并用仓库内置基准的真实数据说话。为什么百万行 Excel 会吃光内存用传统方式处理大表格时整个工作簿会被一次性读进内存构建完整对象模型再一次性序列化成文件。行数翻倍内存跟着翻倍。实测中writeXlsx写 10 万行就需要758 MB峰值内存——百万行基本不可行。流式streaming的思路完全不同流式读取把 ZIP 归档从头到尾逐个解析行数据一行一行地从 SAX 解析器流过永远不缓冲整个工作表。流式写入工作簿以字节流的形式在行数据被拉取的同时产出峰值内存不随行数增长。核心实现分别在 src/xlsx/stream-reader.ts 和 src/xlsx/stream-writer.ts。流式读取一行一行流过数据逐行读取的基本用法import { streamXlsxRows } from hucre/xlsx for await (const row of streamXlsxRows(buffer)) { console.log(row.index, row.values) }streamXlsxRows返回一个异步生成器for await循环里每次只拿到一行处理完即丢弃内存中始终只有一小段数据。直接接 HTTP 流文件连下载都不必完整缓冲它可以接收ReadableStream——ZIP 从头到尾按本地文件头顺序解析整个归档从不落进内存。只有几个很小的元数据部件内容类型、关系、工作簿、共享字符串、样式会预读目标工作表则直接管道式送入解析器const res await fetch(https://example.com/huge.xlsx) for await (const row of streamXlsxRows(res.body!)) { console.log(row.index, row.values) }这对从服务器流式转发大文件的场景特别友好浏览器下载了多少就处理多少。两个实用选项maxRows 与 rangemaxRows限制产出行数预览/抽样。达到上限后底层的 ZIP/SAX 流会被直接取消超大工作表依然很便宜。range按 A1 区域过滤比如range: B2:D1000区域外的行跳过、区域外的列置为null且解析到结束行之后立即停止。流式写入峰值内存与行数无关writeXlsxStream真正恒内存的写出路径import { writeXlsxStream } from hucre/xlsx function* rows() { for (let i 0; i 1_000_000; i) yield [i 1, Math.random()] } return new Response( writeXlsxStream(rows(), { name: BigData, columns: [{ header: ID }, { header: Value }], freezePane: { rows: 1 }, }), { headers: { content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, }, }, )它接受任何Iterable 或 AsyncIterable 作为行源——数据库游标、别的流都行返回的是一个ReadableStreamUint8Array可以直接作为 HTTP 响应体。行数据随拉随写峰值内存大约只有O(不同样式数)与行数无关。超过 Excel 行数上限自动分表Excel 单表硬性上限是 1,048,576 行。XlsxStreamWriter支持maxRowsPerSheet超出时自动溢出到名称_2、名称_3……表头行还会在每个新表中重复const writer new XlsxStreamWriter({ name: BigData, columns, repeatHeaders: true }) for (let i 0; i 3_000_000; i) writer.addRow([i 1, Math.random()]) // → BigData, BigData_2, BigData_3三条写路径怎么选writeXlsx()XlsxStreamWriterwriteXlsxStream()输出完整文件PromiseUint8ArrayReadableStream行的来源先构建完整模型addRow推送从可迭代源拉取峰值内存O(数据)O(数据)O(样式数)——扁平选型口诀很简单需要直接响应流或下载链接 →writeXlsxStream最终必须要一个Uint8Array→XlsxStreamWriter数据量小、还要完整功能样式、条件格式等→writeXlsx。注意XlsxStreamWriter.toStream()只是把finish()的结果包成流并不限制内存恒内存路径始终是writeXlsxStream/writeCsvStream这类函数。实测数据基准数字一览以下数据来自仓库内置基准测试环境为 Linux Node 24场景代码见 bench/read.mjs、bench/write.mjs方法说明在 bench/README.md你可以用bun run bench在自己的机器上复现。写入12 列混合文本/数字/日期数据10 万行写路径耗时峰值内存writeXlsxStream2,230 ms92 MBXlsxStreamWriter2,877 ms604 MBwriteXlsx3,186 ms758 MB推到 30 万行writeXlsxStream只长到 126 MBXlsxStreamWriter涨到 1,515 MB——几乎不随行数增长 vs 线性增长这就是流式写入的承诺。行数writeXlsxStream峰值堆XlsxStreamWriter峰值堆30 万41 MB328 MB100 万67 MB1,037 MB300 万70 MB不可行百万行只要 67 MB——这正是标题里百万行常内存的含义。读取同一形状的两份 10 万行 × 12 列测试文件两份文件唯一的差别是不同字符串的数量40 万种 vs 10 种读法40 万种字符串10 种字符串readXlsx2,721 ms / 662 MB1,896 ms / 392 MBreadXlsxmaxRows: 10001,953 ms / 656 MB1,150 ms / 221 MBstreamXlsxRows2,446 ms / 556 MB1,592 ms /90 MB这是理解流式读取成本的关键streamXlsxRows对行数是恒内存的对不同字符串数是线性的——因为xl/sharedStrings.xml是全工作簿部件必须预读。导出姓名、SKU、自由文本这类高基数数据时流式读取与缓冲式读取差距不大而重复值很多的表格流式的优势能放大到 7 倍以上90 MB vs 662 MB。maxRows限制的是输出不是工作量高基数场景下只省了 28% 时间和 1% 内存别指望它秒读大文件。不止 XLSX流式能力覆盖全部格式格式整体读整体写流式读流式写增量写XLSX✔✔✔✔多表✔CSV✔✔✔✔✔NDJSON✔✔✔✔✔ODS✔✔✔✔✔XML✔✔✔✔—几个典型场景NDJSON 实时导出NdjsonStreamWriter.toStream()是唯一边进边出的实时流行入队即释放内存最低。CSV 恒内存写出300 万行254 MB CSV在 128 MB 堆上限下writeCsvStream顺利完成类式写法直接内存溢出。ODSwriteOdsStream是恒内存路径但只能带值不能带样式ODF 的自动样式块必须写在正文之前流式没法回头补写需要样式就选OdsStreamWriter缓冲写出。更多边界与格式差异见 docs/PARITY.md 与 docs/SPEC-COVERAGE.md。安装与快速上手npm install hucre按需引入、包体可树摇流式 XLSX 读取约 34 KB gzipimport { streamXlsxRows, writeXlsxStream } from hucre/xlsx小结读大文件streamXlsxRows逐行流过可直接消费 HTTP 响应流记住行数恒内存、字符串数线性的成本模型。写大文件首选writeXlsxStream峰值内存与行数无关百万行实测 67 MB。超出行数上限XlsxStreamWriter的maxRowsPerSheet自动分表并重复表头。想验证数字跑bun run bench每个场景独立子进程测量结果可复现。用对这几条 API百万行级别的 Excel 在浏览器、Node、边缘运行时里都能从容处理。【免费下载链接】hucreZero-dependency spreadsheet engine. Read write XLSX, CSV, ODS. Pure TypeScript, works everywhere.项目地址: https://gitcode.com/gh_mirrors/hu/hucre创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表