問題タブ [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.
posix - Posix共有メモリとマップトファイル
このテーマについて少し学んだので、POSIX共有メモリ(shm_open)とPOSIXマップトファイル(mmap)の本当の違いは何でしょうか。
どちらも、古いIPCメカニズムではなく、/ dev/tmpfsサブシステムを使用しているようです。
では、共有メモリよりもmmapファイルを使用する利点はありますか?
ありがとう。
c# - .NET 4.0 メモリ マップ ファイルのパフォーマンス
.NET 4.0 の新しいメモリ マップ ファイル機能を試した人がいるかどうか知りたいですか? OS と同じくらい古いものであることは知っていますが、.NET でのネイティブ処理は新しいものです。
誰かがこれをテストして、パフォーマンスについて何か言うことができましたか? バイナリファイルのランダムな部分へのアクセス時間、書き込み速度などに非常に興味があります。また、ネイティブの WinAPI MMF とのパフォーマンス比較もよいでしょう。
ありがとう!
.net - .NET 4メモリマップAPIは代替データストリームをサポートしていますか?
Microsoftは、.Net 4に新しいSystem.IO.MemoryMappedFiles名前空間を導入しました。代替データストリームをサポートするかどうか誰かが知っていますか?どうも!
c++ - 32ビットと64ビットのプロセス間で共有されるMapViewOfFile
別の32ビットプロセスのメモリにすでにマップされているファイルの64ビットプロセスでMapViewOfFileを使用しようとしています。失敗し、「アクセスが拒否されました」というエラーが表示されます。これは既知のWindowsの制限ですか、それとも何か間違ったことをしていますか?同じコードが2つの32ビットプロセスで正常に機能します。
コードの種類は次のようになります。
memory-mapped-files - メモリ マップ ファイルと「ソフト」ページ フォールト。やむを得ない?
Windows XP で実行されている 2 つのアプリケーション (プロセス) があり、メモリ マップ ファイルを介してデータを共有しています。反復ごとのメモリ割り当てをなくすためのあらゆる努力にもかかわらず、データ転送ごとに約 10 のソフト ページ フォールトが発生します。CreateFileMapping() と CreateFileView() にあるすべてのフラグを試しましたが、それでも発生します。それがメモリマップファイルの仕組みなのかどうか疑問に思い始めています。
メモリ マップド ファイルの背後にある O/S 実装の詳細を知っている人がいる場合は、次の理論に関するコメントをいただければ幸いです。無効として書き込まれます。他のプロセスが無効化されたページに属するメモリ領域を読み取ろうとすると、(設計により) ソフト ページ フォールトが発生し、O/S は無効化されたページをリロードすることを認識します。また、ソフト ページ フォールトの数は、データ書き込みのサイズに正比例します。
私の実験は、上記の理論を裏付けているようです。データを共有するときは、1 つの連続したデータ ブロックを書き込みます。つまり、共有メモリ領域全体が毎回上書きされます。ブロックを大きくすると、それに応じてソフト ページ フォールトの数が増えます。したがって、私の理論が正しい場合、メモリ マップト ファイルを使用しない以外に、ソフト ページ フォールトをなくすためにできることはありません。皮肉なことに、TCP ソケット接続の代わりにメモリ マップド ファイルを使用することを選択したのは、その方が効率的であると考えたからです。
ソフト ページ フォールトが無害である場合は、注意してください。数が多すぎると、ある時点でシステムのパフォーマンスが損なわれる可能性があると聞いています。ソフトページフォールトが本質的にそれほど有害ではない場合、1秒あたりの数が「過剰」であるというガイドラインがある場合は、それを聞きたいです。
ありがとう。
memory-mapped-files - メモリ マップド ファイルから取得したデータをキャッシュすることは理にかなっていますか?
または、OS が独自のキャッシュを実装している可能性があるため、マップされたメモリからそのデータを再度読み取る方が高速でしょうか?
データの性質は事前にわかりません。ファイルの読み取りはランダムであると想定されています。
c# - 高速検索と持続性のためのデータ構造の最適なストレージ
シナリオ
次の方法があります。
最初は、フォーム上のストレージを考えています:
と
AddItemSecurity
サードパーティ API からデータを取得する方法に基づいてGetValidItemIds
おり、実行時にどのように使用したいかです。
2000 人のユーザーと 1000 万のアイテムが存在する可能性があります。アイテム ID の形式は次のとおりです: 2007123456、2010001234 (最初の 4 桁が年を表す 10 桁)。
AddItemSecurity
超高速である必要はありませんが、GetValidIds
1 秒未満である必要があります。また、既存の更新がある場合はitemId
、リストに含まれなくなったユーザーの itemId を削除する必要があります。
これをどのように最適な方法で保管するかを考えようとしています。ディスク上 (キャッシュあり) が望ましいですが、コードを保守可能でクリーンなものにしたいと考えています。
MaxItemId / 8
アイテム ID が 0 から始まる場合、ユーザーごとに の長さのバイト配列を作成し、アイテムが存在するかどうかを true/false ビットに設定することを考えました。これにより、配列の長さがユーザーごとに 1 MB 強に制限され、検索が高速になり、ユーザーごとにリストを簡単に更新できるようになります。これを .Net 4 フレームワークでメモリ マップ ファイルとして永続化することで、キャッシュ ロジックを自分で実装しなくても (マシンに十分な RAM がある場合)、まともなキャッシュも得られると思います。IDを解析し、年を取り除き、年ごとに配列を保存することが解決策になる可能性があります。
ItemId -> UserId[] リストをディスクに直接シリアライズし、通常の方法で読み取り/書き込みを行うFileStream
ことで、リストを永続化し、変更があった場合に比較することができます。
新しいユーザーが追加されるたびに、すべてのリストも更新する必要がありますが、これは毎晩行うことができます。
質問
このアプローチを引き続き試す必要がありますか、それとも他の方法を検討する必要がありますか? 私は、SQL サーバーのパフォーマンスが十分ではなく、(少なくとも別のサーバーでホストされている場合) オーバーヘッドが発生すると考えていますが、私の仮定は間違っている可能性があります。この問題に関する考えや洞察は大歓迎です。そして、ハードウェアをあまり追加せずに解決したいと思います:)
[2010-03-31 更新]
次の条件で SQL Server 2008 をテストしました。
- 2 つの列 (userid、itemid) を持つテーブルは両方とも Int です
- 2 つの列のクラスター化インデックス
- 180 人のユーザーに約 800.000 アイテムを追加 - 合計 1 億 4,400 万行
- SQL サーバー用に割り当てられた 4GB RAM
- デュアルコア 2.66GHz ノートパソコン
- SSD ディスク
- SqlDataReader を使用してすべての itemid をリストに読み込む
- すべてのユーザーをループする
1 つのスレッドを実行すると、平均して 0.2 秒になります。2 番目のスレッドを追加すると、最大 0.4 秒になりますが、それでも問題ありません。そこから成績はどんどん落ちていきます。3 番目のスレッドを追加すると、多くのクエリが最大 2 秒かかります。4 番目のスレッドは最大 4 秒、5 番目のスレッドは一部のクエリを最大 50 秒スパイクします。
これが進行している間、CPU は 1 つのスレッドであってもルーフィングしています。私のテストアプリは、高速ループのために一部を取り、残りをSQLします。
これは、あまりうまくスケーリングできないという結論につながります。少なくとも、テスト済みのハードウェアではそうではありません。アイテムごとに 1 つのレコードではなく、ユーザーごとに int の配列を格納するなど、データベースを最適化する方法はありますか。ただし、これにより、アイテムを削除するのが難しくなります。
[2010-03-31 更新 #2]
同じデータをメモリマップファイルのビットとして入れて簡単なテストを行いました。はるかに優れたパフォーマンスを発揮します。6 スレッドのアクセス時間は 0.02 秒から 0.06 秒です。純粋にメモリバウンド。マップされたファイルは 1 つのプロセスによってマップされ、他の 6 つのプロセスによって同時にアクセスされました。また、SQL ベースが 4GB を使用したため、ディスク上のファイルは 23MB を使用しました。
java - 従来の IO とメモリ マップド
従来の IO と Java のメモリ マップ ファイルのパフォーマンスの違いを学生に説明しようとしています。インターネットのどこかで例を見つけましたが、すべてが明確であるとは限りません。すべての手順が必要だとは思いません。私はあちこちでそれについて多くのことを読みましたが、どちらの正しい実装についても確信が持てません。
私が理解しようとするコードは次のとおりです。
正確にいつ使用する必要がありますRandomAccessFile
か?ここでは、ファイルの読み取りと書き込みに使用されますmemoryMappedCopy
が、実際にはファイルをコピーするだけで十分ですか? それともメモリマッピングの一部ですか?
ではcustomBufferedCopy
、なぜsynchronized
ここで が使用されているのですか?
また、2 つの間のパフォーマンスをテストする必要がある別の例も見つけました。
多かれ少なかれ何が起こっているのかがわかります。出力は次のようになります。
ストリームの読み取り/書き込みを信じられないほど長くしている理由は何ですか? そして、読み取り/書き込みテストとして、同じ整数を何度も読み取るのは少し無意味に見えます (で何が起こっているかをよく理解している場合Stream Read/Write
) 以前に書き込まれたファイルから int を読み取り、単に同じ場所でintを読み書きしますか? それを説明するより良い方法はありますか?
私はしばらくの間、これらの多くのことについて頭を悩ませてきましたが、全体像を把握することはできません..
c# - 参照型を格納するためのC#でのマップトメモリファイルの使用
辞書をできるだけ早くファイルに保存する必要があります。キーと値はどちらもオブジェクトであり、Serializableとしてマークされる保証はありません。また、何千ものオブジェクトをシリアル化するよりも高速な方法を好みます。そこで、.NET 4でのマップトメモリファイルのサポートを調べました。ただし、MemoryMappedViewAccessorは構造体の格納のみを許可し、参照型は許可しないようです。
参照型のファイルで使用されるメモリを保存し、そのメモリのブロブからオブジェクトを再構築する方法はありますか(バイナリシリアル化なし)?
java - メモリ マップト ファイルと Java オブジェクトの透過的な永続性
ごあいさつ
メモリ マップ ファイルを介して Java オブジェクトの透過的な永続性を実現したいと考えています (OS のページング/スワッピング メカニズムを利用します)。
私の問題は次のとおりです: Java オブジェクトをメモリマップされたブロックに移動するにはどうすればよいですか? さらに、新しいオブジェクトインスタンスをそのようなブロックに強制的に配置するにはどうすればよいですか?
ご存知のように、メモリ マップド ブロックはバイト配列と見なすことができます。ここで私が実際に求めているのは、Java オブジェクトのアドレス空間をそのような配列の 1 つとオーバーラップさせる方法です。OSが永続性を透過的に処理している間(ダーティページを書き込む)、オブジェクトを介してデータを操作できるようにします。
Java でこれが許可されない場合、どのクロスプラットフォーム & ガベージ コレクション OO 言語を使用するようにアドバイスしてくれますか?
よろしくお願いします。