readstream - ¿Cuál es el tamaño máximo de un Node.js Buffer
stringdecoder (2)
La longitud máxima es de 1 gb - 1 byte. La constante relevante en el código es v8::internal::ExternalArray::kMaxLength
:
https://github.com/v8/v8/blob/c8bf5c35e431d4029e084024501863a4cf907882/src/objects.h#L4647-L4648
De acuerdo con la documentación de la clase Node.js Buffer, los Buffers se asignan fuera del montón de V8.
http://nodejs.org/docs/latest/api/buffers.html
Los datos sin procesar se almacenan en instancias de la clase Buffer. Un Buffer es similar a una matriz de enteros, pero corresponde a una asignación de memoria bruta fuera del V8 Heap. Un búfer no puede ser redimensionado.
Necesitaba leer un archivo grande (más de 1GB) y traté de usar fd.readPath () pero recibí un error fatal de V8 porque el archivo era mayor a 1GB.
FATAL ERROR: v8::Object::SetIndexedPropertiesToExternalArrayData() length exceeds max acceptable value
Esto fue documentado por Google. http://code.google.com/p/v8/issues/detail?id=847
Pensé que usaría un búfer y ejecuto una versión de 64 bits del nodo 0.6.7, por lo que mi montón debería poder manejar archivos grandes.
$ file `which node`
/usr/local/bin/node: Mach-O 64-bit executable x86_64
$
Sin embargo, si trato de asignar un búfer de 1GB, obtengo el mismo error fatal de V8.
var oneGigInBytes = 1073741824;
var my1GBuffer = new Buffer(oneGigInBytes); //Crash
//var mySmallerBuffer = new Buffer(oneGigInBytes-1); //Works
console.log("done");
Si se asignaba un búfer fuera del montón V8, pensé que podría asignar un tamaño de búfer mayor que el límite de 1 GB, pero el código anterior imprime el mismo error exacto que readPath (). Comentando la instancia my1GBuffer y descomentando mySmallerBuffer funciona para que parezca que el límite es 1GB.
¿Cuál es el tamaño máximo de una instancia de clase Node.js Buffer? ¿Tiene un límite de 1 GB? Mi solución actual es usar el uso de un flujo de lectura y fs.pipe ().
var fs = require(''fs'');
process.chdir("/Users/joel/Desktop/testFiles/");
var stream = fs.createReadStream(''./test1GB_File'', { bufferSize: 64 * 1024 });
stream.pipe(response);
Parece que el tamaño máximo actual del búfer es 2147483647 bytes alias 2.147GB
Fuente: https://.com/a/44994896/3973137 (y mi propio código)