Estoy intentando ajustar el tamaño del búfer ( stdout
) para la salida estándar de una llamada child_process.spawn(), y tengo dificultades para hacerlo con éxito. A continuación hay un código que ilustra lo que estoy buscando. Estoy tratando de realizar algunas evaluaciones comparativas con varios tamaños de búfer estándar, pero hasta que no pueda ajustar el tamaño del búfer, no podré hacerlo. ¡Cualquier consejo sería apreciado, gracias!
// I'm using the `stdout` from a child_process.spawn() call to feed into another stream, and I'm having a hard time increasing the buffer size on stdout. // The code below illustrates the issue: const child_process = require('child_process'); const stream = require('stream'); const fs = require('fs'); const compressStream = child_process.spawn("cat", ["testfile_32MB"], {writableHighWaterMark: 1024*1024, highWaterMark: 1024*1024}); // <-- child_process.spawn does not have highWaterMark or writableHighWaterMark options, so including them has no effect, but I'm including it just as an illustration of what I want. compressStream.stdout.writableLength = 1024*1024; // <-- This does not help. compressStream.stdout._writableState.writableLength = 1024*1024; // <-- This does not help. compressStream.stdout._writableState.writableHighWaterMark = 1024*1024; // <-- This does not help. compressStream.stdout.writableHighWaterMark = 1024*1024; // <-- This does not help. compressStream.stdout._readableState.highWaterMark = 1024*1024; // <-- This does not help. compressStream.stdout._writableState.highWaterMark = 1024*1024; // <-- This does not help. compressStream.stdout.on("data", (data) => { console.log("data length [from spawn()]:", data.length); // <-- data.length will always be <= 64KB! How can we get it higher? }); const readStream = fs.createReadStream("testfile_32MB", {highWaterMark: 1024*1024}); readStream.on("data", (data) => { console.log("data length [from createReadStream()]:", data.length); // <-- This prints values <= 1MB, which is what I wish I had for child_process.spawn/stdout... });
Tenga en cuenta que necesitará un archivo llamado "testfile_32MB" para ejecutar este código de ejemplo, y debe tener al menos unos pocos megabytes de tamaño.
Por desgracia, no puedes hacer esto. highWaterMark
es un mecanismo que se utiliza para señalar al escritor que se detenga porque el lector no está leyendo y su búfer está lleno.
Un Socket
le enviará los datos tan pronto como estén disponibles. Siempre utilizará un búfer interno de 64k codificado de forma rígida. El aumento de highWaterMark
lo hará capaz de contener más datos, pero aún le enviará fragmentos de 64 Kb, excepto que obtendrá ráfagas de varias llamadas por rotación de bucle de evento.
No tiene acceso a las opciones de creación de Stream
cuando usa spawn
; eventualmente puede pasar un flujo de canalización con nombre preconstruido, pero esto no resolverá su problema.