Je cherche à ajouter des variables dans un modèle à des indices spécifiques à travers des streams.
L'idée est que j'ai un stream en lecture et une liste de variables qui peuvent être soit un stream en lecture, un buffer ou une chaîne de caractères de taille indéterminée. Ces variables peuvent être insérées à une liste prédéfinie d'indices. J'ai quelques questions basées sur mes suppositions et ce que j'ai essayé jusqu'à présent.
Ma première tentative a été de le faire manuellement avec des streams en lecture. Cependant, je n'ai pas pu const buffer = templateIn.read(size)
(car les buffers étaient encore vides) avant que template combined
ne tente de le lire. La solution à ce problème est similaire à la façon dont vous utiliseriez un stream de transformation, c'est donc la prochaine étape que j'ai suivie.
Cependant, j'ai un problème avec les streams de transformation. Mon problème est que quelque chose comme ce pseudo code accumulera les buffers en mémoire jusqu'à ce que done()
soit appelé.
public _transform(chunk: Buffer, encoding: string, done: (err?: Error, data?: any) => void ): void {
let index = 0;
while (index < chunk.length) {
if (index === this.variableIndex) { // l'idée de base (la logique réelle est un peu plus complexe)
this.insertStreamHere(index);
index++;
} else {
// continuer à lire le stream normalement
}
}
done()
}
_De : https://github.com/nodejs/node/blob/master/lib/_stream_transform.js_
Dans un stream de transformation, les données écrites sont placées dans un buffer. Lorsque _read(n) est appelé, il transforme les données en attente, appelant le cb _write mis en mémoire tampon au fur et à mesure qu'il consomme des morceaux. Si la consommation d'un seul morceau écrit entraînerait plusieurs morceaux de sortie, alors le premier morceau de sortie appelle le readcb, et les morceaux suivants vont simplement dans le buffer de lecture, et déclenchera 'lisible' si nécessaire.
De cette manière, la pression inverse est en réalité déterminée par le côté lecture, car _read doit être appelé pour commencer le traitement d'un nouveau morceau. Cependant, un transform de type gonflage pathologique peut provoquer une mise en mémoire tampon excessive ici. Par exemple, imaginez un stream où chaque octet d'entrée est interprété comme un entier de 0 à 255, et produit ensuite autant de octets en sortie. Écrire les 4 octets {ff,ff,ff,ff} donnerait lieu à 1 ko de données en sortie. Dans ce cas, vous pourriez écrire une très petite quantité d'entrée, et finir avec une très grande quantité de sortie. Dans un tel mécanisme de gonflage pathologique, il n'y aurait aucun moyen de dire au système d'arrêter de faire la transformation. Un seul écrit de 4 Mo pourrait amener le système à manquer de mémoire.
Donc en résumé : Comment puis-je insérer (de gros) streams à un index spécifique, sans avoir une énorme pression inverse de buffers en mémoire. Tout conseil est apprécié.