問題タブ [mappedbytebuffer]

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 に答える
206 参照

java - ファイルをブロックごとに比較 (バイト) java

2 つのファイルをブロックごとに比較しようとしています。ブロックが等しい場合 - 次のブロックを取得して比較します。最終ブロックが等しい場合 - true を返します。他のすべてのバリアント - false を返します。次のブロックを正しく取得する方法と、ファイルの終わりを取得する方法がわかりません。

0 投票する
2 に答える
4529 参照

java - メモリ不足エラー: Java ヒープ領域

マップされたバイト バッファーを使用してファイルを読み込もうとしていますが、行buffer.position(position);でOutOfMemoryError:JavaHeapSpaceを取得しています。.. コードの何が問題なのかわかりません.. エラーの原因は何ですか?

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

java - 複数のファイルを持つ MappedByteBuffer

Java NIO MappedByteBuffer に関して言えば、異なるファイルの一部をバッファにマップすることは可能ですか? このようなもの:

次に、次のようなもの:

現在、最初の「プット」で、バッファの制限がすでに特定の値に設定されています。バッファへの 2 番目の「プット」により、バッファ オーバーフロー例外が発生します。バッファーに十分なスペースを割り当てました。

このバッファを 2 番目のファイルの値で更新 (追加) するにはどうすればよいでしょうか?

編集:私の最初の質問は間違っていました。より分かりやすいように編集します。

私はいくつかの大きなファイル(たとえば4つ、現在は同じサイズ)を持っており、ファイルは個別でもメモリに収まりません。4 つのファイルに対して操作を実行し、1 つの出力ファイルを作成する必要があります。私のメモリはファイルのサイズに比べてかなり小さいので、一度に 4 ブロックしか処理できません。つまり、一度に各ファイルから 1 ブロックしか処理できません。ファイル内の特定のブロックにマップする複数の MemoryByteBuffers を作成してから、処理のために ByteBuffer に書き込むか、各ブロックを ByteBuffer に直接書き込むことができます。

このシナリオで MemoryByteBuffer を使用する利点/意味はありますか?

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

java - Java での MappedByteBuffer の書き込みと読み取り

Javaでメモリマップファイルについて学んでいます。MappedByteBuffer への書き込み/読み取り方法を知りたいです。

MappedByteBuffer への書き込みに使用しているコードは次のとおりです。

実行しようとすると、BufferOverflow Exception が発生します。

ファイルに書き込む内容のサイズが事前にわからない場合、書き込み中に制限に達した後に MappedByteBuffer のサイズを増やすにはどうすればよいですか?

読み取りのために、この場合を考えてみましょう。初期バッファー サイズで MappedByteBuffer を作成し、その初期サイズの最後に達した場合、ファイルの別の部分をどのようにマップしますか?

より一般的には、ファイルのある部分から別の部分へのバイトオフセットを持つファイルがあります。ポイント(x)でオフセット(y)を読み取ると、(x)から(y)にジャンプしたいと思います。どうすればいいのですか?

助けてくれてありがとう。

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

java - Java でこの「行数」プログラムが遅いのはなぜですか? MappedByteBuffer の使用

(Java のメモリ マップ ファイル)を試すためMappedByteBufferに、単純なwc -l(テキスト ファイルの行数) デモを作成しました。

約 15 MB (15008641 バイト)、100k 行のファイルでこれを試しました。私のラップトップでは、約13.8 sec. なぜそんなに遅いのですか?

完全なクラス コードはこちら: http://pastebin.com/t8PLRGMa

参考までに、Cで同じ考えを書きました: http://pastebin.com/hXnDvZm6

約 28 ミリ秒で実行され490 times fasterます。

好奇心から、Java と本質的に同じアルゴリズムと API を使用する Scala バージョンも作成しました。実行されます。これは10 times faster、何か奇妙なことが起こっていることを示しています。

更新: ファイルは OS によってキャッシュされるため、ディスクの読み込み時間はかかりません。

RAMに収まらない可能性のある大きなファイルへのランダムアクセスにメモリマッピングを使用したかったのです。そのため、BufferedReader を使用しているだけではありません。

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

java - マップサイズを継続的に変更すると、Java MappedByteBuffer のパフォーマンスが悪化する

最近、Java MappedByteBuffer に関するいくつかのテストを行いました。同じファイルを連続してマップして読み取ると、読み取りに費やす時間がどんどん長くなることがわかりました。しかし、マップ サイズを変更しなければ、マップ サイズのバリエーション テストで同じマップ サイズを使用するよりも高速になります。

整数で満たされた1GBのファイル「dataFile」があります。

そしてそれを読む方法

バリエーション buffSize テスト

バリエーション出力:

固定 buffSize テスト:

出力

2 つのテストが示すように、同じ buffSize(1024MB) での読み取りに費やされる時間は、2 つのテストでかなり異なります。buffSize を固定したテストは、バリエーション テストよりもはるかに高速です。

私の質問は次のとおりです。2. MappedByteBuffer は物理メモリを占有していますか? ActivityMonitor でわかるように、物理メモリを占有しません。

ありがとう

- - - アップデート - - -

リリース バッファ コード:

この問題の原因はメモリ使用量ではないと思います。リリースコードとgcコードをオンにしても同じ出力になるからです。とにかく、メモリ使用量については、2 回目のテストでループ時間を 100 に設定しました。最初のテストよりも多くのメモリを使用する必要がありますが、最初のテストよりも高速です。

----- 更新 2 -----

テスト 1 で buffSize を増加させる代わりに減少させると、問題はなくなります。

出力: