1. Bufferএটিকে দেখার জন্য একটি দৃশ্যArrayBuffer ।
একজন Buffer, আসলে, একটি হল FastBuffer, যা extends(থেকে উত্তরাধিকারী) Uint8Array, যা একটি অক্টেট-একক দৃশ্য প্রকৃত মেমরি, একটি এর ( "আংশিক অ্যাকসেসর") ArrayBuffer।
Ode নোড.জেএস 9.4.0/lib/buffer.js#L65-L73
class FastBuffer extends Uint8Array {
constructor(arg1, arg2, arg3) {
super(arg1, arg2, arg3);
}
}
FastBuffer.prototype.constructor = Buffer;
internalBuffer.FastBuffer = FastBuffer;
Buffer.prototype = FastBuffer.prototype;
২.এর ArrayBufferআকার এবং এর দেখার আকার পৃথক হতে পারে।
কারণ # 1: Buffer.from(arrayBuffer[, byteOffset[, length]])।
এর সাথে Buffer.from(arrayBuffer[, byteOffset[, length]]), আপনি Bufferএর অন্তর্নিহিত ArrayBufferএবং দর্শনের অবস্থান এবং আকার নির্দিষ্ট করে একটি তৈরি করতে পারেন ।
const test_buffer = Buffer.from(new ArrayBuffer(50), 40, 10);
console.info(test_buffer.buffer.byteLength); // 50; the size of the memory.
console.info(test_buffer.length); // 10; the size of the view.
কারণ # 2: FastBufferএর স্মৃতি বরাদ্দ।
এটি আকারের উপর নির্ভর করে মেমরিটিকে দুটি পৃথক উপায়ে বরাদ্দ করে।
- যদি মেমরি পুলের আকারের অর্ধেকের চেয়ে কম হয় এবং 0 ("ছোট") না হয় : এটি প্রয়োজনীয় মেমরিটি প্রস্তুত করতে একটি মেমরি পুল ব্যবহার করে ।
- অন্য : এটি এমন একটি উত্সর্গীকৃত তৈরি করে
ArrayBufferযা সঠিকভাবে প্রয়োজনীয় স্মৃতিতে ফিট করে।
Ode নোড.জেএস 9.4.0/lib/buffer.js#L306-L320
function allocate(size) {
if (size <= 0) {
return new FastBuffer();
}
if (size < (Buffer.poolSize >>> 1)) {
if (size > (poolSize - poolOffset))
createPool();
var b = new FastBuffer(allocPool, poolOffset, size);
poolOffset += size;
alignPool();
return b;
} else {
return createUnsafeBuffer(size);
}
}
Ode নোড.জেএস 9.4.0/lib/buffer.js#L98-L100
function createUnsafeBuffer(size) {
return new FastBuffer(createUnsafeArrayBuffer(size));
}
একটি " মেমরি পুল " বলতে কী বোঝ ?
একটি মেমরি পুল হ'ল ছোট আকারের মেমরির অংশগুলি রাখার জন্য একটি নির্দিষ্ট আকারের প্রাক-বরাদ্দ মেমরি ব্লক Buffer। এটি ব্যবহার করে ছোট আকারের মেমরির অংশগুলি শক্তভাবে একসাথে রাখে, তাই ক্ষুদ্র আকারের মেমরি খণ্ডের পৃথক ব্যবস্থাপনার (বরাদ্দকরণ এবং বিলম্বকরণ) ফলে খণ্ডিত হওয়া রোধ করে।
এই ক্ষেত্রে, মেমরি পুলগুলি ArrayBufferহ'ল ডিফল্টরূপে যার আকার 8 কিবি, যা নির্দিষ্ট করা আছে Buffer.poolSize। এটি যখন একটির জন্য একটি ছোট আকারের মেমরির অংশ সরবরাহ করে Buffer, এটি পরীক্ষা করে যে শেষ মেমরি পুলটিতে এটি পরিচালনা করার জন্য পর্যাপ্ত উপলব্ধ মেমরি রয়েছে কিনা; যদি তাই হয়, এটি একটি সৃষ্টি Bufferযে "মতামত" মেমরি পুল প্রদত্ত আংশিক খণ্ড, অন্যথায় যে এটা একটা নতুন মেমরির পুকুর ইত্যাদি সৃষ্টি করে।
আপনি ArrayBufferএকটি এর অন্তর্নিহিত অ্যাক্সেস করতে পারেন Buffer। Bufferএর bufferসম্পত্তি (যে, থেকে উত্তরাধিকারসূত্রে Uint8Array) এটি ঝুলিতে। একটি "ছোট" Buffer এর bufferসম্পত্তি হ'ল ArrayBufferসম্পূর্ণ মেমরি পুলকে উপস্থাপন করে। তাই এই ক্ষেত্রে, ArrayBufferএবং Bufferআকার পরিবর্তিত হয়।
const zero_sized_buffer = Buffer.allocUnsafe(0);
const small_buffer = Buffer.from([0xC0, 0xFF, 0xEE]);
const big_buffer = Buffer.allocUnsafe(Buffer.poolSize >>> 1);
// A `Buffer`'s `length` property holds the size, in octets, of the view.
// An `ArrayBuffer`'s `byteLength` property holds the size, in octets, of its data.
console.info(zero_sized_buffer.length); /// 0; the view's size.
console.info(zero_sized_buffer.buffer.byteLength); /// 0; the memory..'s size.
console.info(Buffer.poolSize); /// 8192; a memory pool's size.
console.info(small_buffer.length); /// 3; the view's size.
console.info(small_buffer.buffer.byteLength); /// 8192; the memory pool's size.
console.info(Buffer.poolSize); /// 8192; a memory pool's size.
console.info(big_buffer.length); /// 4096; the view's size.
console.info(big_buffer.buffer.byteLength); /// 4096; the memory's size.
console.info(Buffer.poolSize); /// 8192; a memory pool's size.
৩. সুতরাং আমাদের এটিকে " ভিউগুলি " হিসাবে স্মৃতি বের করতে হবে ।
একটি ArrayBufferআকারে স্থির হয়, তাই আমাদের অংশটির একটি অনুলিপি তৈরি করে তা বের করতে হবে। এই কাজের জন্য, আমরা ব্যবহার Bufferএর byteOffsetসম্পত্তি এবং lengthসম্পত্তি , যা সুত্রে প্রাপ্ত Uint8Array, এবং পদ্ধতি , যা একটি একটি অংশ একটি কপি করে তোলে । এখানে- পদ্ধতিটি @ জাচবি দ্বারা অনুপ্রাণিত হয়েছিল ।ArrayBuffer.prototype.sliceArrayBufferslice()
const test_buffer = Buffer.from(new ArrayBuffer(10));
const zero_sized_buffer = Buffer.allocUnsafe(0);
const small_buffer = Buffer.from([0xC0, 0xFF, 0xEE]);
const big_buffer = Buffer.allocUnsafe(Buffer.poolSize >>> 1);
function extract_arraybuffer(buf)
{
// You may use the `byteLength` property instead of the `length` one.
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);
}
// A copy -
const test_arraybuffer = extract_arraybuffer(test_buffer); // of the memory.
const zero_sized_arraybuffer = extract_arraybuffer(zero_sized_buffer); // of the... void.
const small_arraybuffer = extract_arraybuffer(small_buffer); // of the part of the memory.
const big_arraybuffer = extract_arraybuffer(big_buffer); // of the memory.
console.info(test_arraybuffer.byteLength); // 10
console.info(zero_sized_arraybuffer.byteLength); // 0
console.info(small_arraybuffer.byteLength); // 3
console.info(big_arraybuffer.byteLength); // 4096
4. কর্মক্ষমতা উন্নতি
আপনি যদি ফলাফলগুলি কেবল পঠন হিসাবে ব্যবহার করতে চান, বা ইনপুটগুলির Bufferবিষয়বস্তুগুলি সংশোধন করা ঠিক আছে , আপনি অপ্রয়োজনীয় স্মৃতি অনুলিপি এড়াতে পারবেন।
const test_buffer = Buffer.from(new ArrayBuffer(10));
const zero_sized_buffer = Buffer.allocUnsafe(0);
const small_buffer = Buffer.from([0xC0, 0xFF, 0xEE]);
const big_buffer = Buffer.allocUnsafe(Buffer.poolSize >>> 1);
function obtain_arraybuffer(buf)
{
if(buf.length === buf.buffer.byteLength)
{
return buf.buffer;
} // else:
// You may use the `byteLength` property instead of the `length` one.
return buf.subarray(0, buf.length);
}
// Its underlying `ArrayBuffer`.
const test_arraybuffer = obtain_arraybuffer(test_buffer);
// Just a zero-sized `ArrayBuffer`.
const zero_sized_arraybuffer = obtain_arraybuffer(zero_sized_buffer);
// A copy of the part of the memory.
const small_arraybuffer = obtain_arraybuffer(small_buffer);
// Its underlying `ArrayBuffer`.
const big_arraybuffer = obtain_arraybuffer(big_buffer);
console.info(test_arraybuffer.byteLength); // 10
console.info(zero_sized_arraybuffer.byteLength); // 0
console.info(small_arraybuffer.byteLength); // 3
console.info(big_arraybuffer.byteLength); // 4096