問題タブ [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.
c# - メモリ マップト ファイルを使用する場合
ネットワーク経由でデータのチャンクを受信し、それらをディスクに書き込むアプリケーションがあります。すべてのチャンクが受信されると、実際に表す単一のファイルにデコード/再結合できます。
メモリ マップ ファイルを使用することが有用かどうか疑問に思っています。
私自身の感覚では、2 番目のケースにのみ役立つ可能性があります。
編集: これは C# アプリであり、x64 バージョンのみを計画しています。(したがって、「最大連続空き領域」の問題に遭遇することは関係ありません)
java - Java の FileChannel のメモリ内バージョン
使用しているライブラリにいくつかの変更を加えているところです。メモリ使用量を減らすために、ライブラリは一時データをメモリに保持する代わりにディスクに書き込みます。ただし、私の使用シナリオでは、メモリに保持する方が効率的です。また、一時ファイルの名前が一定であり、異なるスレッドで同時に実行できないため、並行性の問題もあります (スレッドが互いのデータを破損するため)。
したがって、代わりにすべてのデータをメモリに保持するようにライブラリを変更する必要があります。私は最初にライブラリを作成したことがないため、コードを大幅に変更することにあまり慣れていません。したがって、できるだけ少ないリファクタリングでこれを行いたいと思います。ディスクに書き込むコードは非常に単純です。以下は (やや簡略化された) 例です。
ブロックの読み取りは非常に似ています (つまり、RandomAccessFile から取得する FileChannel を使用します)。
ファイルではなくメモリ内の場所にマップする FileChannel の実装を使用できる場合、最も簡単な解決策のように感じます。FileChannel の map-method を使用して、ファイルをメモリ内の場所にマップできることを知っています。しかし、それは逆です。これにより、ファイルへの「メモリ API」が得られます。一部のメモリに対して FileChannel インターフェイスが必要です。これの利用可能な実装はありますか?
java - Java MappedByteBuffersを使用して「このコマンドを処理するのに十分なストレージが利用できません」と表示されるのはなぜですか?
ディスクベースのファイルと処理するMappedByteBuffersのページングリストを使用している非常に大きなdoubleの配列があります。詳細については、この質問を参照してください。Java1.5を使用してWindowsXPで実行しています。
これが、ファイルに対してバッファの割り当てを行う私のコードの重要な部分です...
2番目または3番目のバッファーを割り当てた後、タイトルに記載されているエラーが発生します。
使用可能な連続メモリと関係があると思ったので、さまざまなサイズとページ数で試してみましたが、全体的なメリットはありませんでした。
「このコマンドを処理するのに十分なストレージが利用できない」とは正確にはどういう意味で、もしあれば、私はそれについて何ができますか?
MappedByteBuffersのポイントは、ヒープに収まるよりも大きな構造体を処理し、それらをメモリ内にあるかのように処理できることだと思いました。
手がかりはありますか?
編集:
以下の回答(@adsk)に応じて、コードを変更したので、一度に複数のアクティブなMappedByteBufferが存在することはありません。現在マップされていないファイルの領域を参照するときは、既存のマップをジャンクして新しいマップを作成します。約3回のマップ操作の後でも、同じエラーが発生します。
GCがMappedByteBuffersを収集しないことで引用されたバグは、JDK1.5でもまだ問題のようです。
c++ - ブースト メモリ マップ ファイルの問題: RAM ではなくディスクに移動します
Boost メモリ マップ ファイルがどのように機能するかを理解しようとしています。次のコードは機能し、想定どおりに動作しますが、問題は、生成されたファイルがメモリではなくディスク (実行可能ファイルと同じディレクトリ) に保存されることです。どこかに設定するフラグがあるのかもしれませんが、見つけられませんでした...
情報を事前にありがとう!
使用コンパイラ: gcc 4.2.1
Boost 1.41.0
OS: MacOS X 10.6.2
.net - C+C# プロセス間通信: 名前付きパイプ、メモリ マップ ファイルなど?
グローバルな Windows イベントをフックするために C dll を使用しています。次のステップは、C# アプリケーションにいくつかのイベント データ (巨大なものではない) を送信することです。
この通信をできるだけ高速にしたいので、名前付きパイプとメモリ マップ ファイルの 2 つのオプションを分析しています。
.NET 4 が MMF をネイティブな方法で提供することは知っていますが、Win98 クライアントがまだ存在する可能性があるため、.NET 2 をターゲットにする必要があります。また、Windows API を介して .NET 2 で MMF を管理する方法があることも知っています (また、いくつかのラッパーを作成した人もいます)。
この文脈で、私は知りたいです:
- MMF の代わりに名前付きパイプを選択することに大きな欠点 (主にパフォーマンス) はありますか? 大量のデータを転送しないことを覚えておくことが重要です。
- NP または MMF (.NET 2 を対象) に関連するセキュリティ上の問題はありますか?
- それらよりも良い選択肢はありますか?
c++ - C++ Boost メモリ マップ ファイルを使用してディスク バック データ構造を作成する
Boost.Interprocess を使用して、ディスクでバックアップされたデータ構造を作成することを検討しています。Boost ドキュメント ( http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess.html ) の例は、メモリ マップ ファイルも使用できると述べていますが、すべて共有メモリを使用するためのものです。ここで誰かがメモリマップファイルを使用したことがあるかどうか疑問に思っていますか? 開始するための公開されているコード サンプルはありますか (たとえば、メモリ マップされたファイルでバックアップされたマップまたはセット)?
c++ - C++ でファイルを読み書きするための高速なクロスプラットフォーム アルゴリズム
どこにも答えが見つからない、一見単純な質問を投げかけたいと思います。標準準拠のすべての C++ コンパイラでコンパイルでき、外部ライブラリを必要とせずにすべてのオペレーティング システムで動作する、ファイル入力および/または出力用の最新のFASTアルゴリズムはありますか?
- 最速の方法はメモリ マップされたファイルを使用することですが、すべてのプラットフォームで同じコードを動作させる必要があるため、そうはなりません。
- Win32 API のような API を使用できないため、プラットフォーム固有になります
- 私はcを使いたくありません。可能な場合、アルゴリズムをstlを使用した純粋なc ++コードにしたいのですが、asmハック/トリックが混在した醜いcではありません
- wxWidgets、Qt、MFC などの標準 C++ に属さないフレームワークまたは外部ライブラリは使用しないでください。
- この質問全体の大きな強調点は、アルゴリズムが可能な限り高速であることです。メモリマップされたファイルでそれを実行する速度に沿ったものであり、さらに高速であることは素晴らしいことですが、それは不可能であることを私は知っています
私以外の誰かがこれほどクレイジーな研究をしているのを見たことがありますか? そのようなアルゴリズムは可能ですか?
推奨事項をありがとう
.net - ディスク上の本当に巨大なファイルをスキャンする方法は?
ディスク上の非常に巨大なファイル(おそらく4GB以上)を考慮して、このファイルをスキャンして、特定のバイナリパターンが発生する時間を計算したいと思います。
私の考えは:
メモリマップトファイル(CreateFileMapまたはブーストmapped_file)を使用して、ファイルを仮想メモリにロードします。
100MBのマップトメモリごとに、スキャンして結果を計算するスレッドを1つ作成します。
これは実行可能ですか?そうするためのより良い方法はありますか?
更新:
1.6GBファイルのスキャンは11秒以内に処理できるため、メモリマップトファイルが適しています。
ありがとう。
c - この例でremap_file_pages()が失敗するのはなぜですか?
次のCコードは、Linux2.6.30.5-43.fc11.x86_64で発生している問題を示しています。
これは常に失敗し、remap_file_pages()は-1を返し、errnoはEINVALに設定されます。カーネルソースを見ると、remap_file_pages()で失敗する可能性のあるすべての条件を確認できますが、私の例には当てはまらないようです。どうしたの?