複数データを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
この記事を書いた人
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
プチモンテ代表、アーティスト名:プチモンテ | |
🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は叙情詩、叙情的な楽曲が多い。楽曲制作は2023年12月中旬 ~ |
オリジナル曲を始めました✨
YouTubeで各楽曲を公開しています🌈
https://www.youtube.com/@petitmonte