Capire i flussi

0

Ho iniziato a imparare API di streaming e ho trovato una delle buone documentazioni qui . C'è stato un confronto dato dall'autore per dimostrare l'efficacia dei flussi.

var http = require('http');
var fs = require('fs');

var server = http.createServer(function (req, res) {
    fs.readFile(__dirname + '/data.txt', function (err, data) {
        res.end(data);
    });
});
server.listen(8000);

Si dice che nell'esempio sopra, per ogni richiesta l'intero file verrebbe letto e memorizzato in memoria, il che potrebbe creare problemi per un numero elevato di connessioni simultanee. Sembra buono!

Ora, per la soluzione nel secondo esempio:

var http = require('http');
var fs = require('fs');

var server = http.createServer(function (req, res) {
    var stream = fs.createReadStream(__dirname + '/data.txt');
    stream.pipe(res);
});
server.listen(8000);

ci viene detto che dal momento che res è esso stesso è un flusso, quindi possiamo leggere il file tramite stream e convogliare il risultato in res che non creerebbe il problema di memoria.

Domanda

Il browser manterrà aperta la connessione utilizza l'intero file viene letto poiché secondo me il browser conosce HTTP solo quindi come gestirà lo scenario di streaming. Inoltre, non ci vorrà più tempo per lo streaming del file rispetto all'invio di un intero file alla volta?

    
posta CodeYogi 10.07.2016 - 15:31
fonte

1 risposta

0

wouldn't it take longer to stream the file vs sending whole file at a time?

Benvenuto nel compromesso dello spazio tempo . La lettura di un intero file in memoria (diciamo come un array o una stringa) è chiamata slurping . Può essere un'idea buona o cattiva a seconda delle dimensioni del file, della memoria disponibile e di quante volte lo si fa allo stesso tempo.

L'alternativa è elaborazione riga per riga (o elaborazione degli chunk per i file binari). Man mano che le parti più piccole del file entrano in azione, vengono applicate e poi dimenticate. Ciò mantiene l'ingombro di memoria ridotto ma aumenta l'accesso al sovraccarico. Questo è il compromesso che devi bilanciare.

Gli stream possono fare entrambi. Quando offri l'accesso come stream stai dicendo "Non so che cosa stai per fare ma qui è dove trovare i tuoi dati". Una volta che hai uno stream puoi scaricarlo tutto in memoria, agire su parti più piccole o consegnarlo a qualcos'altro come stream.

    
risposta data 10.07.2016 - 16:34
fonte