問題タブ [memory-mapped-files]
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.
.net - .Net 4.0 の MemoryMappedViewAccessors を使用する最も適切な方法は何ですか?
メモリ マップされた大きなファイルをスクロール可能なボックスに表示する場合、ビューがファイル全体を表すのと、現在表示されているファイルの領域のみを表すのとのどちらがより適切ですか?
より大まかに言うと、.Net のメモリ マップ ファイルでページングが行われるのは、抽象化のどのレベルですか? メモリに保持されているファイルのページ サイズ/量は、MemoryMappedViewAccessors に関連していますか、それともこれらのオブジェクトとは無関係ですか?
c++ - メモリマップファイルの使用に費やされた理解できない時間
メモリ マップト ファイルを使用して 2 つのファイルを比較するルーチンを作成しています。ファイルが大きすぎて一度にマップできない場合。ファイルを分割し、パーツごとにマップします。たとえば、1049MB のファイルをマップするには、512MB + 512MB + 25MB に分割します。
コード ロジックはまったく同じですが、残りの部分 (この例では 25MB) を比較するのに常に非常に長い時間がかかります。3 つの観察:
- 主要部分 (512MB * N) と残り (この例では 25MB) のどちらが先に比較されても、結果は同じままです。
- 残りの余分な時間はユーザーモードで費やされているようです
- VS2010 ベータ 1 でのプロファイリングでは、時間は t 内で費やされ
std::_Equal()
ますが、この関数はほとんど (プロファイラーは 100% と言います) I/O および他のスレッドを待機しています。
私は試した
- VIEW_SIZE_FACTOR を別の値に変更する
- ラムダファンクターをメンバー関数に置き換える
- テスト中のファイルサイズの変更
- 残りの実行順序をループの前後に変更する
結果は非常に一貫していました。残りの部分とユーザーモードでより多くの時間がかかりました。
マップされたサイズがマッピングの配置 (私のシステムでは 64K) の倍数ではないという事実と関係があると思われますが、その方法はわかりません。
以下は、ルーチンの完全なコードと 3G ファイルで測定されたタイミングです。
誰か説明してくれませんか、ありがとう?
出力:
残りのラウンドのセグメント サイズ = 354410496 バイト
実際の 116.892 秒、CPU 56.201 秒 (48.1%)、ユーザー 54.548 秒、システム 1.652 秒
セグメント サイズ = 536870912 バイト、ラウンド #0
実際の 72.258 秒、CPU 2.273 秒 (3.1%)、ユーザー 0.320 秒、システム 1.953 秒
セグメント サイズ = 536870912 バイト、ラウンド #1
実際の 75.304 秒、CPU 1.943 秒 (2.6%)、ユーザー 0.240 秒、システム 1.702 秒
セグメント サイズ = 536870912 バイト、ラウンド #2
実際の 84.328 秒、CPU 1.783 秒 (2.1%)、ユーザー 0.320 秒、システム 1.462 秒
セグメント サイズ = 536870912 バイト、ラウンド #3
実際の 73.901 秒、CPU 1.702 秒 (2.3%)、ユーザー 0.330 秒、システム 1.372 秒
レスポンダーによる提案後のさらなる観察
残りをボディとテールにさらに分割します (残り = ボディ + テール)。
- ボディ = N * アライメント()、テール < 1 * アライメント()
- 本体 = m * 配置 ()、および末尾 < 1 * 配置 () + n * 配置 ()、ここで m は偶数です。
- ボディ = m * アライメント()、テール < 1 * アライメント() + n * アライメント()、m は 2 の指数です。
- 本体 = N * 配置 ()、テール = 残り - 本体。N はランダムです。
合計時間は変化しませんが、時間は必ずしも尻尾に関係しているのではなく、体と尻尾のサイズに関係していることがわかります。大きい部分ほど時間がかかります。時間は、私には最も理解できないユーザータイムです。
また、Procexp.exe を介してページ フォールトも確認します。残りは、メイン ループより多くのフォールトを取りません。
アップデート 2
他のワークステーションでいくつかのテストを実行しましたが、問題はハードウェア構成に関連しているようです。
テストコード
観察:
私と同じハードウェア構成を持つ別の 2 台の PC では、結果は次のように一貫しています。
------VS2010Beta1ENU_VSTS.iso [1319909376 バイト] ------
残りのサイズ = 44840960 バイト
Remainder_tail サイズ = 14336 バイト
実際の 0.060 秒、CPU 0.040 秒 (66.7%)、ユーザー 0.000 秒、システム 0.040 秒
Remainder_body サイズ = 44826624 バイト
実際の 13.601 秒、CPU 7.731 秒 (56.8%)、ユーザー 7.481 秒、システム 0.250 秒
セグメント サイズ = 67108864 バイト、合計ラウンド数 = 19
実際の 172.476 秒、CPU 4.356 秒 (2.5%)、ユーザー 0.731 秒、システム 3.625 秒
ただし、ハードウェア構成が異なる PC で同じコードを実行すると、次の結果が得られました。
------VS2010Beta1ENU_VSTS.iso [1319909376 バイト] ------ 残りのサイズ = 44840960 バイト
Remainder_tail サイズ = 14336 バイト
実際の 0.013 秒、CPU 0.000 秒 (0.0%)、ユーザー 0.000 秒、システム 0.000 秒
Remainder_body サイズ = 44826624 バイト
実際の 2.468 秒、CPU 0.188 秒 (7.6%)、ユーザー 0.047 秒、システム 0.141 秒
セグメント サイズ = 67108864 バイト、合計ラウンド数 = 19
実際の 65.587 秒、CPU 4.578 秒 (7.0%)、ユーザー 0.844 秒、システム 3.734 秒
システム情報
私のワークステーションは理解できないタイミングをもたらします:
OS名:Microsoft Windows XP Professional
OS バージョン: 5.1.2600 サービス パック 3 ビルド 2600
OSメーカー:マイクロソフトコーポレーション
OS 構成: メンバー ワークステーション
OS ビルド タイプ: ユニプロセッサ フリー
元のインストール日: 2004-01-27, 23:08
システム稼働時間: 3 日 2 時間 15 分 46 秒
システム メーカー: Dell Inc.
システム モデル: OptiPlex GX520
システムの種類: X86 ベースの PC
プロセッサ: 1 プロセッサがインストールされています。
BIOS バージョン: DELL-7
Windows ディレクトリ: C:\WINDOWS
システム ディレクトリ: C:\WINDOWS\system32
起動デバイス: \Device\HarddiskVolume2
システム ロケール: zh-cn;中国語 (中国)
入力ロケール: zh-cn;中国語 (中国)
時間帯: (GMT+08:00) 北京、重慶、香港、ウルムチ
合計物理メモリ: 3,574 MB
利用可能な物理メモリ: 1,986 MB
仮想メモリ: 最大サイズ: 2,048 MB
仮想メモリ: 利用可能: 1,916 MB
仮想メモリ: 使用中: 132 MB
ページ ファイルの場所: C:\pagefile.sys
ネットワーク カード: 3 NIC がインストールされています。
「正しい」タイミングをもたらす別のワークステーション: OS 名: Microsoft Windows XP Professional
OS バージョン: 5.1.2600 サービス パック 3 ビルド 2600
OSメーカー:マイクロソフトコーポレーション
OS 構成: メンバー ワークステーション
OS ビルド タイプ: マルチプロセッサ フリー
元のインストール日: 2009 年 5 月 18 日、午後 2:28:18
システム稼働時間: 21 日 5 時間 0 分 49 秒
システム メーカー: Dell Inc.
システム モデル: OptiPlex 755
システムの種類: X86 ベースの PC
プロセッサ: 1 プロセッサがインストールされています。
BIOS バージョン: DELL-15
Windows ディレクトリ: C:\WINDOWS
システム ディレクトリ: C:\WINDOWS\system32
起動デバイス: \Device\HarddiskVolume1
システム ロケール: zh-cn;中国語 (中国)
入力ロケール: en-us;英語 (米国)
時間帯: (GMT+08:00) 北京、重慶、香港、ウルムチ
合計物理メモリ: 3,317 MB
利用可能な物理メモリ: 1,682 MB
仮想メモリ: 最大サイズ: 2,048 MB
仮想メモリ: 利用可能: 2,007 MB
仮想メモリ: 使用中: 41 MB
ページ ファイルの場所: C:\pagefile.sys
ネットワーク カード: 3 NIC がインストールされています。
説明理論はありますか?ありがとう。
android - コンテンツ プロバイダーからメモリ マップされた InputStream を返しますか?
コンテンツ プロバイダー コンシューマーのクライアント側では、画像を読み取るための適切な InputStream を取得するために、次のようなことができます。
これは優れた API であり、サーバー側では、実際のコンテンツ プロバイダーは次の呼び出しを行います。
しかし、URI にマップされた画像がファイルシステム上ではなく、メモリ リソースとして、またはオンザフライで生成された場合はどうなるでしょうか。
一時ファイルをディスクに保存する必要がなく、コンテンツ プロバイダのコンシューマに返すことができるように、マップされたメモリFile
または などを作成できますか?InputStream
windows - Windows メモリ マップ ファイルの監視
Windows で、CreateFileMapping() によって作成されたファイル マッピング オブジェクトを追跡するにはどうすればよいですか? 基本的に、使用中のメモリマップファイルの数と、それらの名前、サイズなどの情報を知りたいです。ありがとう!
c# - MemoryMappedFile.CreateFromFileは常にUnauthorizedAccessExceptionをスローします
.NET 4.0はベータ版であることに気付きましたが、誰かがこれに対する解決策を持っていることを望んでいます。DLLからメモリマップトファイルを作成しようとしています。
残念ながら、私が何をしてもUnauthorizedAccessException
、MSDNのドキュメントに次のように記載されているが常に表示されます。
オペレーティングシステムは、ファイルへの指定されたアクセスを拒否しました。たとえば、アクセスはWriteまたはReadWriteに設定されていますが、ファイルまたはディレクトリは読み取り専用です。
Sysinternals Process Monitorを使用してアプリケーションを監視しました。これは、ファイルが実際に正常に開かれていることを示しています。他の非DLLファイルのメモリマッピングも試しましたが、同じ結果になりました。
windows - メモリ マップト ファイルは物理メモリに残りますか?
多くのメモリ マップ ファイルを使用するプロセスがあります。
問題は、マシンのメモリが不足している場合でも、これらのファイルが物理メモリに保持され、他のプロセスがこのメモリを必要とすることです。
SetProcessWorkingSetSizeを使用してプロセスのワーキング セットを制限しようとしましたが、役に立ちません。プロセスのワーキング セットが最大値を超えて増加し続けます。
プロセスのワーキング セットを制限するより良い方法はありますか?
ページング メモリ マップ ファイルの Windows のヒューリスティックを変更できますか?
c++ - 物理ディスクとボリュームのメモリマッピング
Windowsでは、を介してデバイスとボリュームを開くことができますCreateFile()
。以前はこれをデバイスから正常に使用していましたReadFile()
が、今はメモリマッピングに切り替えたいと思います。次のコードではINVALID_HANDLE_VALUE
、の値を受け取りb
、、にc
設定されて87
いERROR_INVALID_PARAMETER
ます。
どうすればこれを機能させることができますか?
windows - メモリマップトファイルはオプションで書き込み可能ですか?
メモリマップトファイルを使用する場合、読み取り専用または書き込み専用のいずれかであるように見えます。これは、あなたができないことを意味します:
- 1つを書き込み用に開いて、後でそれを保存しないことを決定します
- 読んで開いて、後でそれを保存することにしました
このアプリケーションは、書き込み可能なメモリマップファイルを使用してデータファイルを保存しますが、ユーザーは変更を保存せずに終了したい場合があるため、ユーザーが実際に編集する一時ファイルを使用する必要があります。ユーザーが変更を保存することを選択すると、元のファイルが一時ファイルで上書きされるため、最新の変更が適用されます。ファイルが非常に大きくなる可能性があり(> 1GB)、ファイルのコピーに長い時間がかかるため、これは面倒です。
ファイルマッピングの作成に使用されるフラグの多くの組み合わせを試しましたが、オンデマンドで保存する柔軟性を可能にするものはないようです。誰かがこれが事実であることを確認できますか?このアプリケーションはDelphiで記述されていますが、この場合、標準のWindowsAPIを使用してマッピングを作成します。
c#-4.0 - .Net 4.0 メモリ マップト ファイルと RDMS ストレージ
従来の SQL ベースのデータベースにデータを格納する方法と、新しい .Net 4.0 ランタイムのようなメモリ マップ ファイルを使用する方法を比較する人々の考えに興味があります。問題のデータは、単純な構造の配列です。
明らかな長所と短所:
SQL データベースの長所
- アドホック クエリのサポート
- SQL 管理ツール
- スキーマの変更 (列の追加とデフォルト値の設定)
メモリマップの長所
- オーバーヘッドが軽くなる?(これは私の勝手な推測です)
- プロセススレッド間で共有可能
- 他のもの?
パフォーマンスを向上させる価値はありますか?
linux - メモリマップファイルシステムコール - Linux
ファイルをメモリにマップするときは、システム コールが必要です。ファイルへの後続のアクセスにはシステム コールが必要ですか、それともプロセスの仮想メモリ ページはメモリ内の実際のページ キャッシュにマップされていますか?
update : 私が知りたいのは、複数のプロセスが mmap を介して同じファイルにアクセスしている場合です。それらは同じ物理メモリ部分の書き込みにアクセスします。