stringdecoder readstream read nodejs node data convert node.js v8

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)