Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
const fs = require('fs');
const src = fs.createReadStream('bigfile3.txt');
const des = fs.createWriteStream('newTest.txt');
I can use either
src.on('data',(chunk)=>{
des.write(chunk);});
src.pipe(des);
Is there any difference between this two ways of handling the file operation? The pipe method gives me an error of
> "size" argument must not be larger than 2147483647 whenever I try with a large file.(~2GB)
Can anyone explain the working behind pipe and stream? Thanks.
–
You should use the pipe method because the flow of data will be automatically managed so that the destination Writable stream is not overwhelmed by a faster Readable stream.
If your readable stream is faster than the writable stream then you may experience data loss in des.write(data) method so better you should use src.pipe(des);
If the file size is big then you should use streams, thats the correct way of doing it, I tried similar example like yours to copy 3.5 GB file with streams and pipe, it worked flawlessly in my case. Check you must be doing something wrong.
The example which I tried
'use strict'
const fs =require('fs')
const readStream = fs.createReadStream('./Archive.zip')
const writeStream = fs.createWriteStream('./Archive3.zip')
readStream.pipe(writeStream)
However, if you still need to use stream des.write(data), you can handle backpressure to avoid loss of data when readStream is faster. If the response from des.write(data) is false, then the writeStream is loaded, pause the readStream src.pause().
To continue when writeStream is drained, handle drain event on writeStream and resume in the callback.
des.on("drain", () => src.resume())
To allow higher writeStream buffer memory, you can set highWaterMark for readStream to a very high value, example
const des = fs.createWriteStream('newTest.txt',{
highWaterMark: 1628920128
Be careful of too massive highWaterMark because this takes of too much memory and defeat the primary advantage of streaming data.
I will definitely still recommend using pipe as this handles everything for you with lesser code.
Docs:
https://nodejs.org/api/stream.html#stream_writable_write_chunk_encoding_callback
https://nodejs.org/api/stream.html#stream_readable_pipe_destination_options
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.