diff --git a/CHANGELOG.md b/CHANGELOG.md
index e25a8dd..11202ae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,6 +16,10 @@
 - Purely numeric tokens such as `#10` are no longer tagged as `HST`; hashtags must contain at least one letter.
 - Documentation examples were revised and anonymized for public release.
 
+### Fixed
+
+- Sparse mode now respects stdout backpressure, avoiding Node.js heap exhaustion on very large corpora with many matches.
+
 ## 1.0.0
 
 - Initial release.
diff --git a/Readme.md b/Readme.md
index 1fc5c46..a1227ee 100644
--- a/Readme.md
+++ b/Readme.md
@@ -104,7 +104,7 @@
 
 The tagger is implemented in Node.js because the runtime provides efficient regular-expression execution, which is central to this regex-based annotation workflow.
 
-On CMC corpora with many matches, throughput is above 13 MB/s. This includes dense CMC material such as the NottDeuYTSch corpus.
+On CMC corpora with many matches, throughput is above 10 MB/s. This includes dense CMC material such as the NottDeuYTSch corpus.
 
 ## Applications
 
diff --git a/src/index.js b/src/index.js
index ce45a04..3d34cd2 100755
--- a/src/index.js
+++ b/src/index.js
@@ -70,28 +70,36 @@
 
 const EmojiRegex = require('emoji-regex');
 const emojiRegex = EmojiRegex();
+const { once } = require('events');
 const readline = require('readline');
 global.header = '';
+global.fileheader = '';
 global.standalone = false
 
 
 const rl = readline.createInterface({
   input: process.stdin,
-  output: process.stdout,
   terminal: false,
 
 });
 
 
-function parseConllu(line) {
+async function writeOutput(text) {
+  if (!process.stdout.write(text)) {
+    await once(process.stdout, 'drain');
+  }
+}
+
+
+async function parseConllu(line) {
   if (line.match('#\\s*foundry')) {
     if (line.match('=\\s*base')) {
       if (options.sparse) {
         global.standalone = true
       }
-      process.stdout.write("# foundry = cmc\n");
+      await writeOutput("# foundry = cmc\n");
     } else {
-      process.stdout.write(`${line}\n`);
+      await writeOutput(`${line}\n`);
     }
     return
   }
@@ -104,21 +112,21 @@
       global.fileheader += `${line}\n`;
       return;
     } else if (line.match('^#\\s*eo[ft]')) {
-      process.stdout.write(`${line}\n`);
+      await writeOutput(`${line}\n`);
       return;
     } else if (line.match('^#')) {
       global.header += `${line}\n`;
       return;
     } else if (line.trim().match('^$')) {
       if (global.header == "") {
-        process.stdout.write("\n");
+        await writeOutput("\n");
       }
       global.header = '';
       return
     }
   } else {
     if (!line.match('^\\d+')) {
-      process.stdout.write(`${line}\n`);
+      await writeOutput(`${line}\n`);
       return;
     }
   }
@@ -128,7 +136,7 @@
   const word = columns[1];
   // Guard clause: if word is undefined, just output the line as-is
   if (!word) {
-    process.stdout.write(`${line}\n`);
+    await writeOutput(`${line}\n`);
     return;
   }
 
@@ -167,16 +175,24 @@
       }
     }
     if (global.standalone) {
-      process.stdout.write(fileheader);
-      process.stdout.write(header);
+      await writeOutput(fileheader);
+      await writeOutput(header);
       new_tag = null;
       header = fileheader = '';
     }
-    process.stdout.write(columns.join('\t') + '\n');
+    await writeOutput(columns.join('\t') + '\n');
   } else if (!global.standalone) {
-    process.stdout.write(`${line}\n`);
+    await writeOutput(`${line}\n`);
   }
 }
 
-rl.on('line', parseConllu);
-rl.on('close', () => process.exit(0)); // important to exit, otherwise the process will hang
+async function main() {
+  for await (const line of rl) {
+    await parseConllu(line);
+  }
+}
+
+main().catch((error) => {
+  console.error(error);
+  process.exit(1);
+});
