매우 큰 base64 인코딩 된 문자열을 바이트 (Uint8) 배열로 읽은 다음 해당 바이트 배열을 지정된 크기의 청크로 분할해야합니다. 별도로 청크. 아래 함수를 사용하면 작동하지만 .slice 또는 .toString을 호출하면 각 호출마다 힙의 메모리가 증가합니다. 왜냐하면 (나는) 그것이 버퍼의 복사본을 만들고 있기 때문입니다. 특히 큰 base64Encoded 문자열의 경우 애플리케이션의 힙 공간이 부족합니다. 이것을 특정 크기로 나누고 base64로 메모리가 부족한 상태로 인코딩하려면 어떻게해야할까요?Node.js 메모리가 부족한 매우 큰 버퍼를 자름
const process = function (reallyLargeBase64EncodedString, splitSize){
var theBuffer = Buffer.from(reallyLargeBase64EncodedString, 'base64');
//var tempBuffer = new Buffer(splitSize);
for (var start = 0; start < theBuffer.length; start += splitSize) {
//for(var z = 0; z < splitSize; z++){
//tempBuffer.writeUInt8(theBuffer[start+z],z);
//}
//var base64EncodedVal = tempBuffer.toString('base64');
//var base64EncodedVal = theBuffer.buffer.toString('base64', start, start+splitSize);
var base64EncodedVal = theBuffer.slice(start,start+splitSize).toString('base64');
//do stuff with the base64 encoded value
}
}};
아니요,''slice'가 메모리를 복사하지 않습니다. (https : //nodejs.org/api/buffer.html#buffer_buf_slice_start_end). 'toString' 않습니다. 당신이 문자열로하고있는 "물건"은 정확히 무엇입니까? – Bergi
지금 바로 데이터베이스에 삽입하십시오. 음, 문자열에서 BLOB로 행을 변경하고 바이트 배열을 직접 삽입하는 것이 문제가되는 toString입니다. –
데이터베이스 삽입이 비동기입니까? 한 번에 모든 문자열이 메모리에 생성되지 않도록 순차적으로 만들 수 있습니다. – Bergi