問題タブ [file-mapping]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
449 参照

c++ - ファイル マッピング オブジェクトとファイル オブジェクトを同じ意味で使用できますか?

CreateFile関数のラッパー関数を生成したいとします。

この新しい関数は、ディスク上に実際のファイルを生成するのではなく、ファイル マッピング オブジェクトを作成し、新しいオブジェクトへのハンドルを返します。

この例、Creation Named Shared Memoryを見て、関数を実装しようとしました。

問題

これは私には問題ないように見えましたが、返さHANDLEれたReadFile関数を使用しようとすると、エラー コード 6 が発生しました。The handle is invalid.

質問

ファイル マッピング オブジェクトとファイル オブジェクトを同じ意味で使用できますか? もしそうなら、私のコードの問題は何ですか? そうでない場合、そのような機能をどのように実装できますか?

0 投票する
0 に答える
192 参照

visual-c++ - Visual C++を使用してメモリ内の大きなテキストファイルを断片的にマップする方法は?

ディスク上にサイズが 20 GB の大きなプレーン テキスト ファイルがあります。このファイルに「MyFile.txt」という名前を付けましょう。このファイルには、英語の単語と「+++」の値を持つ 1 つの文字列のみが含まれています。この文字列に FlagString という名前を付けましょう。MyFile.txt の先頭から FlagString まで、正しい英単語があります。ファイルのこのセクションをディクショナリと呼びましょう。ただし、FlagString の後の最初の単語から MyFile.txt の最後まで、単語にスペルミスがある可能性があります。ファイルのこのセクションを CheckedSection と呼びましょう。チェックされたセクションから各単語を読み取り、この単語のスペルを検証して、何らかのアルゴリズムに従って辞書内の適切な単語と比較する必要があります。MyFile.txt が大きい場合は、CreateFileMapping 関数と MapViewOfFile 関数を使用してファイルをメモリにマップします。私の問題は次のとおりです。

  1. MyFile.txt は大きいので、断片的にメモリにマップしたいと考えています。各フラグメントのサイズを 1GB とします。CreateFileMapping を使用してメモリ内の断片的なファイルをマップする方法を教えてください。
  2. メモリへのフラグメント ファイル マッピングを使用する場合、FlagString を Dictionary と CheckedSection の間の区切り文字として識別するにはどうすればよいですか。MyFile.txt の FlagString は、1GB セクションの境界では必須ではありませんが、1GB セクションの内側にある場合があります。ファイルがメモリにマップされた後、ファイル内の位置をマークするために使用するファイル カーソルはありますか?
  3. MyFile.txt から 2 つのメモリ マッピングを作成できますか? Dictionary の 1 つのマッピングと CheckedSection の別のマッピング。
  4. Dictionary または CheckedSection の現在の 1 GB セクションの処理が終了するたびに、UnmapViewOfFile と CloseHandle を呼び出す必要がありますか?
0 投票する
2 に答える
1536 参照

c++ - Windows で共有メモリを正しく使用する方法

私は共有メモリが初めてで、実際の例を探していました.MSDNでしか見つけることができませんでした

最初のプロセスで、共有メモリを次のように宣言しました。

そして2番目のプロセスで:

mapView の作業が完了したら、' UnmapViewOfFile()' を使用して解放する必要があることはわかっています。私の質問は、正確にはどこですか?

  1. 親プロセス?
  2. 子プロセス
  3. 両方?

両方にある場合、OS は完全に解放される前にアドレスの参照カウントを保持しますか?

MSDN から:

また、対応する物理ページの共有数を減らします

これにより、実際に何をすべきかについて少し混乱しました。

0 投票する
5 に答える
10137 参照

c++ - CreateFileMapping、MapViewOfFile、C++ リークの処理

背景:複数のプロセスからアクセスできるメモリ マップ ファイルを作成しようとしています。以下のコードでは、現在の質問に関連するコードのみを入れて、物事を単純化しています。msdn によると、ファイルマップを作成し、ファイルのビューをマップし、CreateFileMapping から受け取ったハンドルを閉じることができ、MapViewOfFile は FileMap を維持します。UnmapViewOfFile.

MSDN: CreateFileMapping 関数

ファイル マッピング オブジェクトのマップされたビューは、オブジェクトへの内部参照を維持し、ファイル マッピング オブジェクトは、それへのすべての参照が解放されるまで閉じません。したがって、ファイル マッピング オブジェクトを完全に閉じるには、アプリケーションは UnmapViewOfFile を呼び出してファイル マッピング オブジェクトのすべてのマップされたビューのマップを解除し、CloseHandle を呼び出してファイル マッピング オブジェクト ハンドルを閉じる必要があります。これらの関数は、任意の順序で呼び出すことができます。

問題:ファイルのビューを正常にマッピングし、CreateFileMapping によって受け取ったハンドルを閉じた後、FileMap は存在しなくなり (まだ存在するはずです)、MemMapFileReader はエラー 0 で新しいマップを作成できます。エラー 183 「既に存在します」)

悪い解決策:ハンドルを閉じないと MemMapFileReader プログラムからアクセスできますが、プロセスが閉じられるまでハンドルが閉じられないため、MemMapFileCreator でハンドル リークが発生します。

質問:何が欠けているか、または間違っていますか?

MemMapFileCreator

MemMapFileReader

0 投票する
0 に答える
707 参照

python - ファイル名を必要とする関数にメモリ ファイルを渡す

問題にならないことを願っていますが、私はiOSでpythonistaを使用しています。一部の lib 呼び出しでは、コンテンツをフォーム/ユーザー インターフェイスにレンダリングするために json ファイルへのパスが必要です。ただし、私が見る限り、変数から JSON データをレンダリングする API はありません。JSON データを読み込んでファイルとして再度書き出し、そのファイルを使用すると、すべて正常に動作します。ただし、関数に渡すことができるメモリ内のファイル オブジェクトを指すある種の仮想ファイル名が必要です。基本的に、呼び出されている関数は、私が提供したパスがメモリファイルハンドルであるという事実を忘れています。私はここで検索しましたが、この件名はよくわかっていないようです。または、間違って検索しました。想像できますが、この機能は非常に重要です。

0 投票する
1 に答える
2525 参照

c++ - ファイル マッピングの仕組み

40 GB の大きなバイナリ ファイルをトラバースする必要があるプログラムを作成していますが、物理 RAM が 16 GB しかありません。友人は、ファイル マッピングを使用してこの問題を軽減できると教えてくれました。ファイル マッピングを作成してファイル マップ ハンドルに読み込む方法と、ファイル マッピングが永続メモリ内のファイルの一部を読み取り用の仮想メモリの異なるチャンクにマップする方法を理解しています。

したがって、これを正しく理解していれば、たとえば 10 GB のバッファーを作成し、ファイルの最初の 10 GB をこのバッファーに読み込むことができます。しかし、ファイルの 10 GB マークを超えて読み取る必要がある場合、OS は別のブロックを自動的に取得するのでしょうか、それともコードで手動で取得する必要がありますか?

0 投票する
1 に答える
4456 参照

c - MapViewOfFile オフセット - 使用方法

ゲーム (PT では「jogo」) を開発すると、サーバーは最大 5 つの同時ゲームをホストでき、クライアントはマップされたメモリを介してアクセスします。

だからここに私が持っているものがあります:

サーバ:

クライアント:

「sizeof(sJogo)*MAX_JOGOS」のビューを作成してから、ポインター +=sizeof(sJogo) * index; をインクリメントしてみました。うまくいかなかったので、オフセットの使い方を教えてもらえますか?

私はかなりしつこく検索し、ここでstackoverflowで良い例を見つけましたが、それはC ++であり、適応できませんでした.

上位の DWORD オフセットは sizeof(sJogo) で正しいでしょうか? しかし、粒度とは何か、またはそれを下位のDWORDに適用する方法がわかりません...

手伝って頂けますか?ありがとうございました。


編集:

以下のコードは、i = 1 (NULL) のときに返されますが、何が間違っていますか?


編集2:

上記の問題を解決し、ここで解決策を見つけました:

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366548%28v=vs.85%29.aspx

2 回目の試行で MapViewOfFile が NULL を返す原因となっていた、オフセットの割り当ての粒度を考慮していませんでした。

上記のリンクは、それをオフセットに適用する方法の明確な例を示しています。