PROFIからSUPER PROFIへの質問-1. - ページ 27

 
sergeev:

メモリマッピングの 仕事に関する質問です。

コピーや再作成に頼らずに、割り当てられたメモリのサイズ(CreateFileMapping)とその投影(MapViewOfFile)を動的に変更することは可能ですか?

つまり、問題はこれです。

100バイトのプロセス間(ライター・リーダー)でデータをやり取りするために、メモリ上にCreateFileMappingオブジェクトを作成し、同じサイズの100バイトのMapViewOfFileを作成します。

最初のプロセスの書き込みプロセスは、2番目の読み取りプロセスがクリーンアップするために管理することができないデータのすべての100バイトをメモリに書き込むことができます。

そこで、CreateFileMapping / MapViewOfFileを再度作成することなく、割り当てられたメモリサイズを拡張する方法はないでしょうか?
そのため、最初のプロセスはリリースを待たずに追加されたサイズに書き込みを続け、2番目のプロセスもさらに読み込みを続けることになる。

できます。でも、一度にたくさん割り当てる方がいい。より高速に動作するようになります。同じライブラリに実装しています。
 
Zhunko:
はい、できます。しかし、一度に大きなサイズを割り当てる方が良い。 。

えー、それはちょっと語弊がありますね。

マッピングにはサイズがなく、作成時に最大サイズのみが指定され、通常は(デフォルトでは)作業中のファイルのサイズに 等しくなります。

ビューサイズは作成時に設定され、アクセスフラグを持つシャーマニズムの場合のみ、UnmapViewOfFile関数なしで変更することができ、おそらく不可能です。

また、なぜサイズを全く変えないのですか?

 
Zhunko:
はい、できます。
MSDNやgoogleに行かせないでください。

TheXpert:

えー、それはちょっと語弊がありますね。

マッピングにはサイズがなく、作成時に最大サイズだけが指定され、通常は(デフォルトでは)作業中のファイルのサイズと等しくなります。


次に、物理的なファイルではなく、単にメモリで作業しています。あるプロセスは、別のプロセスに情報を渡します。

また、なぜサイズを全く変えないのですか?

動作中は、割り当てられたメモリが 100バイトいっぱいになります。しかし、新しいデータが登場すると、結果的にそれを追加しなければならない。だから、このサイズを拡大して追加する必要があるのです。

そのため、中間コピーと再作成を行わずに、割り当てた100バイトを拡張する方法を尋ねているのです。

ビューで取得しました。 あとは作り直すだけです。しかし、CreateFileMappingオブジェクト自体についてはどうでしょうか? それを閉じずに展開することができますか?

 
どうやらCreateでマッピングのサイズが固定に設定されているようです。
.
再作成しかできないのでしょう。
.
BUT:巨大なサイズ(例えば2ギガバイト)のスパースファイルを作成した場合、
、問題ありません。しかし、ファイルの終わり は、システムのファイルサイズの外で理解する必要があります。
.
しかし、そうなるともう、ファイル(
)からの読み込み処理をどう同期させるか、つまり、データのどの部分がどこに書き込まれたかをどう把握するかが問われることになる。
 

大筋では、このようなボリュームは必要ありません。

そして、読み手がすべてのデータの書き込みを待っている間、書き手が不幸にならない方法が必要である。

つまり、配列の内容を変えずに拡張するためには、ArrayResizeの ようなものが必要です。リーダーがすべてのデータを取得したら、メモリ全体が再び最初から書き込み可能になります。

 
jartmailru:

しかし、その場合、ファイルから読み込む処理をどのように同期させるのかが問題になります -。
つまり、データのどの部分がどこに書き込まれたかを知るにはどうしたらいいかということです。

この問題を一気に解決しました。

が、ダイナミックリサイズはまだです :(

Vadim(Zhunko)がそんなに寛大なら、どの機能を使えばいいのか教えてほしいのですが......。
 
繰り返しますが、スパースファイルというものがあります...。
これは、2ギガのファイルがディスク上で0バイトを占有することを意味します。

うーん、ファイルの最大サイズに設定できないか
転送するデータの量?
 
jartmailru:
繰り返しますが、スパースファイルというものがあります...。
2ギガのファイルがディスクに0バイトで済むということです。

私はファイルを使わず、すべてメモリで行っています。 もう3回も書いていますね。

// より簡単なら

CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, FILE_SIZE, "Localpage")を使用します。

このFILE_SIZEで困っています。

ふむふむ、で、転送するデータの最大サイズにファイルを設定することはできないんですね。
データ量は事前にわからない。
Sparseについては、ダイナミックに拡張できるのであれば、有用かもしれませんね。
 
sergeev:

そこがポイントです。 サイズは100バイトに設定されていると申し上げました。

第二に、私は物理的なファイルではなく、単なるメモリを扱っています。あるプロセスが別のプロセスに情報を渡します。

何が違うの?本質は同じで、情報がディスクではなくメモリに書き込まれるだけです。同じように、CreateFileで開いたハンドルで作業しています。

そこで(メモリ上にファイルを作成する際に)最大可能サイズを指定する必要があり、それ以上では情報がありません。

作業している間に、割り当てられたメモリは100バイトいっぱいになってしまう。

で、何が問題なんだ?100byteのオフセットで別のビューを作ったが、マッピング(=ファイル)サイズにはあらかじめこれを考慮する必要がある。

景色と一緒に手に入れました。しかし、CreateFileMappingオブジェクト自体? それを閉じずに展開することは可能ですか?

拡大するのは間違っている、そのサイズはすでにこれを考慮しているはずだ。
 
TheXpert:
拡大するのは間違っている、そのサイズはすでにこれを考慮しているはずだ。
それしかないようです。
理由: