createReadStream dans Node.JS
J'ai donc utilisé fs.readFile() et il me donne
"ERREUR FATALE: CALL_AND_RETRY_LAST de Répartition de l'échec du processus de
de mémoire"
depuis fs.readFile() charge l'intégralité du fichier en mémoire avant d'appeler la fonction de rappel, dois-je utiliser fs.createReadStream() à la place?
C'est ce que je faisais auparavant avec readFile:
fs.readFile('myfile.json', function (err1, data) {
if (err1) {
console.error(err1);
} else {
var myData = JSON.parse(data);
//Do some operation on myData here
}
}
Désolé, je suis un peu nouveau pour streaming; est la suite de la bonne manière de faire la même chose mais avec en streaming?
var readStream = fs.createReadStream('myfile.json');
readStream.on('end', function () {
readStream.close();
var myData = JSON.parse(readStream);
//Do some operation on myData here
});
Grâce
OriginalL'auteur | 2015-06-02
Vous devez vous connecter pour publier un commentaire.
Si le fichier est énorme, alors oui, le streaming sera la façon dont vous voulez traiter avec elle. Cependant, ce que vous faites dans votre deuxième exemple est de laisser le flux de tampon toutes les données du fichier dans la mémoire et la manipulation sur
end
. C'est pas différente de celle d'readFile
de cette façon.Vous aurez envie de vérifier JSONStream. Ce streaming signifie que vous souhaitez traiter les données comme il s'écoule par. Dans votre cas, vous avez évidemment ont de faire cela parce que vous ne pouvez pas le tampon de l'ensemble du fichier dans la mémoire de tous à la fois. Avec cela à l'esprit, j'espère code comme celui-ci prend tout son sens:
L'avis qu'il a une sorte de modèle de requête. C'est parce que vous n'aurez pas la totalité de l'objet JSON/tableau à partir du fichier de travailler avec tout à la fois, de sorte que vous avez à penser davantage en termes de la façon dont vous voulez JSONStream à traiter les données comme il le trouve.
Vous pouvez utiliser JSONStream essentiellement de requête pour les données JSON qui vous intéressent. De cette façon, vous n'êtes jamais mise en mémoire tampon de l'intégralité du fichier en mémoire. Elle a l'inconvénient que si vous avez besoin de toutes les données, alors vous aurez à diffuser le fichier plusieurs fois, à l'aide de JSONStream à sortir uniquement les données dont vous avez besoin à ce moment-là, mais dans votre cas, vous n'avez pas beaucoup de choix.
Vous pouvez également utiliser JSONStream pour analyser les données dans l'ordre et faire quelque chose comme la déverser dans une base de données.
JSONStream.parse
est similaire àJSON.parse
mais au lieu de retourner un objet entier, il renvoie un flux de données. Lors de l'analyse de flux obtient suffisamment de données pour former un ensemble d'objets qui correspondent à votre requête, il émettra undata
événement avec les données du document qui correspond à votre requête. Une fois que vous avez configuré votre gestionnaire de données vous pouvez transférer votre lecture de flux dans l'analyse les flux et regarder la magie se produire.Exemple:
C'est le verbeux pour vous aider à comprendre ce qui se passe. Voici une manière plus succincte:
Edit:
Pour plus de clarté sur ce qui se passe, essayez de penser comme ça. Disons que vous avez un lac géant et que vous souhaitez traiter l'eau pour la purifier et de faire circuler l'eau à un nouveau réservoir. Si vous aviez un géant magique hélicoptère avec un énorme seau ensuite, vous pouvez voler au-dessus du lac, mettez le lac dans le seau, ajouter des produits chimiques de traitement, puis de s'envoler à destination.
Le problème étant qu'il n'existe pas un tel hélicoptère qui peut faire face à beaucoup de poids ou de volume. Il est tout simplement impossible, mais cela ne signifie pas que nous ne pouvons pas atteindre notre objectif d'une manière différente. Ainsi, au lieu de construire avec vous une série de cours d'eau (cours d'eau) entre le lac et le nouveau réservoir. Vous pouvez ensuite mettre en place le nettoyage des stations de ces rivières qui purifient l'eau qui passe à travers elle. Ces stations pourraient fonctionner dans une variété de façons. Peut-être que le traitement peut être fait si vite que vous pouvez laisser le débit de la rivière librement et à la purification de l'aura se produisent à mesure que l'eau se déplace vers le bas le flux à vitesse maximale.
Il est également possible que cela prenne un certain temps pour que l'eau à traiter, ou que la station a besoin d'une certaine quantité d'eau avant de pouvoir traiter efficacement. Si la conception de votre rivières avoir portes et vous contrôlez le flux de l'eau du lac dans vos rivières, laissant les stations de tampon juste de l'eau dont ils ont besoin jusqu'à ce qu'ils ont accompli leur travail et sorti de l'eau purifiée en aval et sur sa destination finale.
C'est presque exactement ce que vous voulez faire avec vos données. L'analyse de flux est votre nettoyage de la station et des tampons de données jusqu'à ce qu'il a assez pour former l'ensemble d'un document qui correspond à votre requête, puis il pousse simplement que les données en aval (et émet de la
data
événement).Nœud de flux sont bien car la plupart du temps, vous n'avez pas à traiter avec l'ouverture et la fermeture des portes. Nœud de flux sont assez intelligents pour le contrôle de refoulement lorsque le flux de tampons d'une certaine quantité de données. C'est comme si le nettoyage de la station et les portes sur le lac parlent les uns aux autres de travailler le parfait débit.
Si vous aviez un streaming pilote de base de données, alors vous seriez en théorie être en mesure de créer un certain type d'insérer des cours d'eau et le faire
parseStream.pipe(insertStream)
au lieu de la manipulation de ladata
événement manuellement :D. Voici un exemple de création d'une version filtrée de votre fichier JSON, dans un autre fichier.Je vois; j'ai eu de la logique et de sens; merci à l'homme 🙂
Pas de problème. J'ai ajouté un peu de l'analogie vers le bas de la réponse si elle contribue à rendre les choses plus claires. N'oubliez pas d'accepter la réponse si cela vous a aidé 🙂
Oh désolé, j'ai oublié de le marquer comme réponse; merci beaucoup de l'homme!
Mérite plus upvotes! Bonne explication, surtout avec les "rivières"
OriginalL'auteur Chev