NodejsのBuffer

3033 ワード

Javascriptは前の開発言語として、簡単な文字列操作やDOM操作だけで業務需要を満たすことができます.しかし、nodejsアプリケーションでは、ネットワークプロトコル、オペレーティングデータベース、画像処理、アップロードファイル受信などが必要です.そのためJavascriptの固有の文字列操作は需要を満たすことができなくて、そこでbufferの対象は応用して生みます.
1.ブザーのインスタンスを作成する
Bufferの対象はNodeプロセスの起動時に既にロードされていて、彼をグローバルオブジェクトに置いています.ですから、バfferを使う時はrequireでロードする必要がなくてもそのまま使用できます.
var buf  = new Buffer("I am spursyy.");  //new Buffer               

var buf = Buffer .copy("I am spursyy.") //  Buffer.copy()   
一般的なコンストラクタ:A.Buffer.alloc(size[,fill[,encoding])sizeによって新設されたBufferが期待する長さfill_;|を用いて、新規作成したBufferの値を事前に充填します.デフォルト:0
encodingはfillが文字列であれば、その値は文字コードです.デフォルト:'utf 8'
B.Buffer.alloc Unisafe(size)size新規作成のBufferが望む長さ
このようにして作成されたBufferの例の下のメモリは初期化されていない.新しく作成されたBufferの内容は未知であり、敏感なデータが含まれている可能性があります.BUF.fill(0)を使用してBufferを初期化することができる例は0である.
C.Buffer.alloc UnsafeSlow(size)size新規作成のBufferが望む長さ
このようにして作成されたBufferの例の下のメモリは初期化されていない.新しく作成されたBufferの内容は未知であり、敏感なデータが含まれている可能性があります.BUF.fill(0)を使用してBufferを初期化することができる例は0である.
2.Bufferメモリの割り当て
Bufferオブジェクトのメモリ割り当てはV 8のヒープメモリではなく、NodeのC++レベルでメモリを実現するアプリケーションです.大量のデータを処理して採用することができないため、オペレーティングシステムのように少しのメモリを申請する方式を採用して、このように大量のメモリの申請、オペレーティングシステムに対してとても大きい圧力があります.
Bufferモジュールは、迅速な分配池としてBuffer.poolSizeのサイズの内部Bufferのインスタンスを事前に割り当てます.
Buffer.allocとBuffer.alloc Unisafe.fillの重要な違いは、sizeがBuffer.poolSizeの半分以下であれば、Buffer.allocはこの内部のBuffer池を使わないことです.アプリケーションがBuffer.allocUnisafe()を必要とする場合、この微妙な違いは非常に重要である.
Buffer.allocUnisafe()を使用して、新しいBufferを割り当てる場合、割り当てられたメモリが4 KB以下の場合、デフォルトは単一のプリキャストのBufferから切断されます.これにより、アプリケーションは、過剰に独立して割り当てられたBufferのインスタンスを作成するために、ゴミ回収機構を回避することができる.この方法は,ほとんどの永続的なオブジェクトのように追跡とクリーンアップの需要をなくすことにより,性能とメモリ使用を改善した.
開発者が不確定な時間帯にメモリから小さなメモリを保持する必要がある場合は、Buffer.allocUnfeSlow()を使用して、非プールのBufferのインスタンスを作成し、関連するビットをコピーするのが適切です.公式サイトの例:
//           
const store = [];

socket.on('readable', () => {
  const data = socket.read();

  //           
  const sb = Buffer.allocUnsafeSlow(10);

  //            
  data.copy(sb, 0, 0, 10);

  store.push(sb);
});
3.Bufferのつなぎ合わせ
Bufferのアプリケーションシーンでは、通常、データは一定の期間で伝送される.以下は実現コードです.
var fs = require('fs')
var rs = fs.createReadStream('text.txt') 

var data = ''
rs.on("data", function(chunk) {
    data += chunk
})

rs.on("end", function() {
    console.log(data)
})
読むたびにBufferの長さを11に設定すると、中国語の文字が読めば文字化けの問題が発生します.var rs = fs.createReadStream('text.txt', {highWaterMark: 11})解決策1は、読み取り可能なストリームに符号化を設定する.
var rs = fs.createReadStream('text.txt', {highWaterMark: 11})  
rs.setEncoding('utf8')
ソリューション2は、concat()関数を使って文字列をつなぎ合わせます.
var fs = require('fs')
var rs = fs.createReadStream('text.txt') 

var chunks = []
var size = 0
rs.on("data", function(chunk) {
    chunks.push(chunk)
    size += chunk.length
})

rs.on("end", function() {
    var buf = Buffer.contact(chunks, size)
})