vectorもどきver1.55リリース
ツイート2020 8/24 ver1.55
アロケータクラスをvector()の上位クラスに移動。
複数のアロケータクラスを同時に使用する際に、アロケータクラスのインスタンスが必要になり、その分のメモリが消費されるのを防ぐため。
2020 8/23 ver1.54
1.ファイルマッピングを使用するアロケータクラスNV_Windows_FileMappingAlloc()を追加。このクラスの実装のために、アロケータクラスのRealloc()の第一引数を現在のサイズを新たに挿入
2.プライベートヒープのアロケータクラス名をPHNVallocに変更して、デフォルトのアロケータクラスと共用できるように#if #end文を変更
サンプルファイルは1つ追加しました。
allocator.cppで、各アロケータのパフォーマンスが分かるサンプルです。
ファイルマッピングを使用したアロケータ(NV_Windows_FileMappingAlloc())は、巨大なファイルを扱う時に有効かと思われます。データファイルに画像や映像ファイルを含めたい場合にこのアロケータを使えば、RAMを消費せずに巨大ファイルの入ったデータファイルを作成できます。使い勝手はデフォルトのアロケータと全く同じ。
複数プロセスが同時にアクセスすることを想定しないファイルなら、アプリケーションがわざわざデータベースを介してアクセスする必要もなくなります。
NV_Windows_FileMappingAllocで割り当てられたメモリは、実体はHDDやSSDのページファイル(隠し属性でドライブのルートディレクトリに存在)に確保されるので、HDDやSSDが高速なら遅さは気にならないかもしれません。
しかし、HTMLなどでは私が知る限り、画像ファイルなどのありかにメモリアドレスを直接指定することはできないので、いったん別の場所にファイルとして作成する必要があるのがネックですね。
VirtualAllocを使用したアロケータは、サンプルプログラムのコメント文でも書きましたが、呼び出し回数に制限があるようで、いまいち使い勝手の良いものではありません。私のコードにバグがある可能性もありますが、そもそも最初に大きなサイズのメモリを一旦予約して、後で少しずつ利用するやり方を想定しているこの関数は、プログラムを複雑にさせます。その煩雑さをこのクラスライブラリに吸収させてしまえばよいのでしょうが、専用の新しい機能を持つ関数が必要になります。
その点、NV_Windows_FileMappingAllocは、ページファイルが十分に巨大なら最初に大きなサイズを確保しても問題ありませんし、必要なメモリが無くなったら関数に因りますが勝手にメモリ割り当てを拡張します。回数制限もサンプルを実行した限りありません。つまりデフォルトのアロケータの使い勝手と全く同じです。
その代わりメモリ確保する時間は他のアロケータに比べて20~25倍ほど遅くなります。だから、それを使ったデータファイルを読み込み時に出来るだけ大きく割り当て、後でメモリ再割り当てが発生しないようにすれば、応答性に不満は出ないと思われます。サンプルプログラムの結果を見る限り、メモリ確保後のメモリアクセス時間はそんなに違いありません。しかし、これはCPUやメモリの性能でかなり変化する可能性があります。キャッシュメモリが大きければ見かけのスピードは早く感じます。サンプルプログラムで処理するメモリサイズ程度ではキャッシュメモリにすべてのデータが乗っている可能性が高く、メモリアクセス時間が他のものと比べて大した時間差がないのだろうと思われます。
Posted: 2020 年 8月 31 日, カテゴリー vector modoki.
Tags: C++, STL, vector