複数データをUint8Arrayに高速で書き込む[データをメモリへ書き込む]
JavaScrpitのUint8Array型に複数データを高速に書き込む方法をご紹介します。Uint8Arrayとは「8ビット符号なし整数値の配列」です。主にJavaScrpitでファイルを読み書きする場合などに使用します。
この記事はUint8Array型にデータを複数回以上、書き込む事が前提です。
よくある失敗例
次のような手法でUint8Arrayにデータを書き込んでいくと非常に低速となります。
function Combine(U1, U2) { var len1 = U1.length; var len2 = U2.length; var P = new Uint8Array(len1 + len2); // Uint8Array1 len1 = U1.length; for (var i = 0; i < len1; i++) { P[i] = U1[i]; } // Uint8Array2 for (var i = 0; i < len2; i++) { P[i + len1] = U2[i]; } return P; }
この手法は関数の引数で2つのUint8Arrayを受け取り、戻り値にその2つを結合したUint8Arrayを返します。
私はJavsScriptはC言語のように明示的にメモリを確保できないと思っていましたので、このような方法でファイルを作成したのですが、これは絶対駄目です。昔のJavaやJavsScriptのように非常に遅すぎます。
書き込みを高速にするには?
実は簡単なのです。Uint8Arrayを生成する際に
var Stream = new Uint8Array(30000000);
で30Mぐらいメモリを確保してから、データを
Uint8Array.set()
で書き込めば良いのです。
データの初期サイズは作成する「ファイルの種類」によって適宜、変更して下さいね。後はその初期サイズを超えるファイルになった場合は「メモリの再編成」をすればいいだけです。
メモ
雑なコードでよければ、「PDFDesigner」のTMemoryStreamクラスやTFileStreamクラスが参考になるかも知れません。
スポンサーリンク
関連記事
公開日:2016年01月04日
記事NO:01679