2012-01-23 40 views
28

Theo tài liệu lớp đệm Bộ đệm Node.js Bộ đệm được cấp phát bên ngoài vùng hốc V8.Kích thước tối đa của bộ đệm Node.js là gì

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

dữ liệu thô được lưu trữ trong trường hợp của lớp đệm. Bộ đệm là tương tự như một mảng các số nguyên nhưng tương ứng với bộ nhớ thô phân bổ bên ngoài vùng hốc V8. Không thể thay đổi kích thước bộ đệm.

Tôi cần đọc một tệp lớn (lớn hơn 1GB) và cố gắng sử dụng fd.readPath() nhưng có lỗi nghiêm trọng từ V8 vì tệp lớn hơn 1 GB.

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

Tài liệu này do Google cung cấp. http://code.google.com/p/v8/issues/detail?id=847

Tôi figured tôi muốn sử dụng một bộ đệm và tôi đang chạy một phiên bản 64 bit của nút 0.6.7 để heap của tôi sẽ có thể xử lý các tập tin lớn.

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

Tuy nhiên nếu tôi cố gắng phân bổ bộ đệm 1 GB, tôi sẽ gặp lỗi nghiêm trọng tương tự trên V8.

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

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

console.log("done"); 

Nếu một đệm được phân bổ bên ngoài đống V8 tôi figured tôi muốn có thể phân bổ một kích thước bộ đệm lớn hơn giới hạn 1GB nhưng mã trên in lỗi chính xác giống như readPath(). Nhận xét ra thể hiện my1GBuffer và uncommenting mySmallerBuffer hoạt động để nó xuất hiện 1GB là giới hạn.

Kích thước tối đa của cá thể lớp đệm Node.js là gì? Có giới hạn ở 1GB không? Cách giải quyết hiện tại của tôi là sử dụng luồng đọc và fs.pipe().

var fs = require('fs'); 

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

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

Tôi nghĩ rằng trong trường hợp các tệp lớn, nó đang sử dụng lại cùng một cá thể bộ đệm. Vì vậy, nó có một số kích thước cố định mà giữ được đầy dữ liệu khi bạn đọc nó. Đó là một bộ đệm. –

+0

Bây giờ tôi tò mò về cách giải quyết. – jcolebrand

+0

Bạn có cần 1GB dữ liệu trong bộ nhớ cùng một lúc không? Tại sao không phát trực tuyến tệp như bạn hiện đang đủ tốt? – fent

Trả lời

23

Độ dài tối đa là 1gb - 1byte. liên tục có liên quan trong các mã là v8::internal::ExternalArray::kMaxLength:

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

+0

thực sự tôi nghĩ rằng hằng số này có thể được thay thế mà không có bất kỳ tác hại với Smi :: kMaxValue sau đó trên x64 bạn sẽ nhận được ít nhất 2gb bộ đệm. (nhưng nhận được bộ đệm lớn hơn đòi hỏi những thay đổi đáng kể trong V8). –

+0

Cảm ơn bạn đã liên kết tới Github. Nó xác nhận những gì thử nghiệm của tôi cho thấy. – Joel

+1

Do thay đổi trong V8, điều này không còn là trường hợp. Tôi không chắc chắn 100% chính xác nơi nó được xác định hiện tại, nhưng tôi nhận được kích thước tối đa là 2gb-1byte. –

Các vấn đề liên quan