web-dev-qa-db-fra.com

Quelle est la taille maximale d'un tampon Node.js?

Selon la documentation de la classe de tampons Node.js, des tampons sont alloués en dehors du segment de mémoire V8.

http://nodejs.org/docs/latest/api/buffers.html

Les données brutes sont stockées dans des instances de la classe Buffer. Un tampon est similaire à un tableau d'entiers, mais correspond à une allocation de mémoire brute En dehors du segment de mémoire V8. Un tampon ne peut pas être redimensionné.

J'avais besoin de lire un fichier volumineux (supérieur à 1 Go) et j'ai essayé d'utiliser fd.readPath (), mais une erreur fatale de V8 s'est produite, car le fichier dépassait 1 Go. 

FATAL ERROR: v8::Object::SetIndexedPropertiesToExternalArrayData() length exceeds max acceptable value

Cela a été documenté par Google. http://code.google.com/p/v8/issues/detail?id=847

J'ai pensé utiliser un tampon et j'utilise une version 64 bits du noeud 0.6.7 afin que mon segment puisse gérer des fichiers volumineux.

$ file `which node`
/usr/local/bin/node: Mach-O 64-bit executable x86_64
$

Cependant, si j'essaie d'allouer un tampon de 1 Go, j'obtiens la même erreur fatale que V8.

var oneGigInBytes = 1073741824;
var my1GBuffer = new Buffer(oneGigInBytes); //Crash

//var mySmallerBuffer = new Buffer(oneGigInBytes-1); //Works

console.log("done");

Si un tampon était alloué en dehors du tas V8, je pensais pouvoir attribuer une taille de tampon supérieure à la limite de 1 Go, mais le code ci-dessus imprime la même erreur que readPath (). La mise en commentaire de l'instance my1GBuffer et la suppression de la mise en commentaire de mySmallerBuffer fonctionnent de sorte qu'il apparaît que 1 Go est la limite.

Quelle est la taille maximale d'une instance de classe Node.js Buffer? Est-il limité à 1 Go? Ma solution actuelle consiste à utiliser un flux de lecture et et fs.pipe ().

var fs = require('fs');

process.chdir("/Users/joel/Desktop/testFiles/");

var stream = fs.createReadStream('./test1GB_File', { bufferSize: 64 * 1024 });
stream.pipe(response);
32
Joel

La longueur maximale est de 1 Go - 1 octet. La constante pertinente dans le code est v8::internal::ExternalArray::kMaxLength

https://github.com/v8/v8/blob/c8bf5c35e431d4029e084024501863a4cf907882/src/objects.h#L4647-L4648

24
Vyacheslav Egorov

Ceci est maintenant documenté dans le cadre de buffer api du nœud, la taille maximale est buffer.constants.MAX_LENGTH .

buffer.constants.MAX_LENGTH<integer> La plus grande taille autorisée pour une seule instance de tampon.

  • Sur les architectures 32 bits, cette valeur est (2^30)-1 (~ 1 Go).
  • Sur les architectures 64 bits, cette valeur est (2^31)-1 (~ 2 Go).

Cette valeur est également disponible en tant que buffer.kMaxLength.

Donc, vous pouvez comprendre combien il est en faisant

> (require('buffer').constants.MAX_LENGTH + 1) / 2**30
2
1
Evan Carroll

On dirait que la taille maximale de la mémoire tampon actuelle est de 2147483647 octets ou 2.147GB

Source: https://stackoverflow.com/a/44994896/3973137 (et mon propre code)

0
Antoine