QueryPerformanceCounterを使ってそれほど複雑でない関数でのベンチマークを行ったところ
今のところ全ての場合においてメモリマップドファイルのほうが単純なファイルの読み書きより高速でした。
(こんないい機能があったなんて…(笑))
それほど差がない場合もありましたが、場合によっては100倍以上もの差になった時もあります。(実メモリと比較したら全然ではありますが)
メモリに困ることは最近それほどなかったので、、仮想メモリのスワップアウトが起きるとどれくらいの速度で動作することになるのか
全く実感できなかったのですが
1.このメモリマップドファイルは
原理的に、それを明示的に行うようなものとみなして問題ないでしょうか?
2.書き込み可能な属性で作り
CreateFileMappingに指定するサイズがファイルサイズより大きかった場合はファイルが拡張され、それ以下だった場合はそのままのようです。
しかし、実際にそれ未満の数値を指定して、その指定したサイズ以上のアドレスのところへ書き込もうとすると、メモリの場合サクッと不正終了してくれるので逆におかしいところがあることが分かるので安心できるともいえるのですが、こちらはファイルサイズに余裕があれば、指定したサイズを超えた部分へもどうやら書き換えることができてしまうようです。
この場合、もしファイルサイズすら超えた数値へ間違って書き込み命令を出してしまった場合、切り捨てられるのでしょうか?それともどこか別のところが書き換えられてしまう危険があるのでしょうか?
3.また、試したら出来てしまったのですが
別のポインタを使って操作するのは「通常の動作」でしょうか?
それとも未定義の動作でしょうか?
例)
・
・
・
char *a = (char*)MapViewOfFile( hMap, FILE_MAP_WRITE , 0, 0, 0);
wsprintf(a,"aaaaaa");
char *b= a+3;
wsprintf(b,"bbbbbb");
b+=3;
wsprintf(b,"ccc");
UnmapViewOfFile( a );
・
・
・
結果:
aaabbbccc
No.3ベストアンサー
- 回答日時:
えーと、質問ではMapViewOfFileでマッピングサイズに0を指定していますが、この場合はマッピングオブジェクト全体がアドレス空間にマップされます。
CreateFileMappingとファイルもサイズ0だとエラーになりますので、マッピングオブジェクトはある程度の大きさを持っているはずです。質問の例は意図せずファイル範囲内になっている可能性があります。あとマップサイズがページサイズ(4KB)の倍数でない場合、端数分は範囲を超えてもアクセス例外は出ないでしょう。また範囲を超えたらアクセス例外が起きることに期待するのは間違いです。そのアドレスにたまたま何か有効な変数に割り当てられているとアクセス例外にはなりませんから。
マップした範囲内なら反映までにある程度の遅延はあるにしてもファイルに反映されます。範囲外だとアクセス例外が出るか、何も出ずに書き込めてしまうかは分かりません。書き込めてもファイルには反映されないと思いますが、無関係な変数を壊している可能性はあります。
4.通常の動作としてはファイルを指定していればそのファイルをマップするのでスワップファイルへのマップはないと思いますが、仕様に明記されていないので保証はできません。
ありがとうございます。
MapViewOfFileについては、上記コードは不正終了しなかった一例として書いただけですので、実際には色々と実験していました。
…が、4KBの倍数にしてはいませんでした。
実際に4KBにしてそれを超えたところへ書き込もうとしてみると、見事に「不正終了」してくれました!
また
>範囲を超えたらアクセス例外が起きることに期待するのは間違い
というのを確認できれば十分です。
一見必要そうな状況があった場合に、そのために変数を用意する必要が本当にあるかどうかが一番の気がかりだったわけですが
通常のメモリと同じように書き込み範囲のサイズを保存しておく方が万全ならば、その変数を「別の場所でも活用した」処理をさせることを考えられれば、パフォーマンス上も全然十分だと思います。
4についても、イメージ通りのようで、安心しました。
これで安心して先に進めそうです。
No.2
- 回答日時:
#1さんの1.→FlushViewOfFileかと。
ありがとうございます。
リモートコンピュータではFlushViewOfFileを普通に呼んでも同期が保証されないようですが
私の目的はローカルコンピュータなのでそれで同期が保証されるようですね。
もちろん
>CreateFile 関数を使ってファイルを開く際に FILE_FLAG_WRITE_THROUGH フラグを指定すると、物理的な書き込みが完了した後で FlushViewOfFile が制御を返すようになります。
とMSDNに書いてあるので、リモートでやりたいならそうすればOKですね。
No.1
- 回答日時:
1. メモリマップドファイルは、プロセスのアドレス範囲を利用できるようにする機能です。
同時にそのアドレス範囲のスワップアウト先を指定ファイルにすることができます。なお、マップしたメモリへの書き込みは必ずしも即座にファイルに反映されるわけではないので注意してください。ファイルでもフラッシュが必要なように、同期APIの呼び出しが必要です。
# 同期APIの名称を思い出せない。アンマップ時しか同期できないかも
2. 書き込み可能マップを作ると、書き込みの有無に関わらずファイルはそのサイズまで拡大されます。逆にマップ作成時に指定したサイズを超えてのアクセスはアクセス例外になります。
3. メモリマップドファイルは、プロセスの指定アドレス範囲を利用可能にします。プロセスで利用可能なアドレス空間をプロセス内のどのポインタでアクセスしても有効です。
ありがとうございます。
やはり明示的に同期させなければ同期が保証されないという点以外は、メモリと同じような扱い方が出来るようですね。
しかし、2のアクセス例外というのは、OSが勝手に握りつぶしてくれる(ファイルのサイズ内なら普通どおりやり、その外だとやめてくれる…?)
のでしょうか?
上記のとおりファイル範囲外に代入したようなコードでも不正終了など全く起こらないばかりか、GetLastErrorとか使っても何も捕捉できません。
使用を控えていた try catch で念のため実験(catchは(...)で)してみても、やはり何も例外を受け取りません。
すみません(汗
もうひとつ重大なことを忘れていました。
4.0xFFFFFFFFを指定するとページングファイルを使うことになり
それ以外なら普通のファイルを使うことになり、ページングファイルは全く使用しないことが保証されるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- CPU・メモリ・マザーボード 質問お願いします 「「RAM2GB+拡張4GB」などと書いてあるのは、搭載されているメモリ(RAM) 6 2023/08/28 12:31
- CPU・メモリ・マザーボード ノートパソコンでクロック数の違うメモリを1枚ずつ挿してデュアルチャンネルになりますか? 1 2022/11/18 00:30
- USBメモリー・SDカード・フラッシュメモリー 銀行が振込データの受け渡しに未だにFDを使っている理由は「FDDがAドライブ固定だから」って本当? 11 2022/06/02 03:53
- C言語・C++・C# このプログラミング誰か教えてくれませんか 2 2022/05/14 09:45
- C言語・C++・C# このプログラミング誰か教えてくれませんか 3 2022/05/13 17:27
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- C言語・C++・C# C言語:数値の桁数指定についての質問です。 8 2022/05/26 23:53
- ドライブ・ストレージ HDDの書き込み回数と寿命について 7 2022/06/04 11:55
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PCに保存していた写真を見られ...
-
OpenFileDialogを使った後にも...
-
拡張子をつくる
-
Excelで外部のファイルの場所を...
-
<a href="file:///フォルダ名/...
-
ExcelVBAでリンク先の対象のフ...
-
社内イントラサイトでのサイト...
-
MkDir パス名が無効です
-
同名フォルダを作成し、そのフ...
-
秀丸のタグジャンプがうまくで...
-
SQLplusでedコマンドが使えない
-
50Mってどのくらいですか・・...
-
EPSON emqファイルをPrint CDで
-
Mac Excel VBAについて
-
Outlookで添付ファイルの貼り付...
-
エクセルVBAで、ファイルの情報...
-
linux duコマンドで困っています。
-
フォルダ名やファイル名、テキ...
-
メルカリを退会して再登録した...
-
Visual C++からftpを使う
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PCに保存していた写真を見られ...
-
拡張子をつくる
-
同名フォルダを作成し、そのフ...
-
Excelで外部のファイルの場所を...
-
MkDir パス名が無効です
-
OpenFileDialogを使った後にも...
-
ExcelVBAでリンク先の対象のフ...
-
<a href="file:///フォルダ名/...
-
サブフォルダに格納されている...
-
EXCEL VBAのDir関数について
-
秀丸のタグジャンプがうまくで...
-
Outlookで添付ファイルの貼り付...
-
Git bashが開かなくなってしま...
-
ファイルの作成日時について
-
VBSでメール送信
-
ExcelのVBProjectがExcelを開く...
-
「~$ファイル名.doc」というフ...
-
スマホでHTMLファイルを開いて...
-
SQLplusでedコマンドが使えない
-
Excelファイルの特定のシートを...
おすすめ情報