--- type: reference title: jq --stream for Huge JSON Files summary: How to use jq's --stream mode to process JSON files too large to load into memory whole. tags: - type/reference - tool/jq - domain/data-processing scope: global last_updated: 2026-06-28 date: 2026-06-28 --- `jq` normally parses an entire JSON document into memory before filtering it, which falls over on multi-gigabyte files. `--stream` mode avoids this by emitting a flat sequence of `[path, leaf-value]` pairs as it parses, instead of building the full in-memory tree. ## Basic usage ``` jq --stream 'select(.[0][0] == "records")' huge-file.json ``` This walks the file incrementally and only ever holds the current path/value pair in memory, not the whole document. ## Reconstructing structure Streamed output is flat, so reassembling a filtered subset back into normal JSON needs `fromstream` on the way out: ``` jq -n --stream 'fromstream(inputs | select(.[0][0] == "records"))' huge-file.json ``` ## When to reach for this - The file is larger than you're willing to hold in memory (multi-GB exports, log dumps). - You only need a small slice of a huge document (e.g., one array's worth of records) and don't want to pay the cost of parsing the rest. - Note that `--stream` filters are noticeably slower per-byte than plain `jq` on data that *does* fit in memory — it's a memory/time tradeoff, not a free win.