問題タブ [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.
java - MappedByteBufferを使用して巨大なファイル〜14GBのファイルを読み取る
I/O 集中型のプロデューサーとコンシューマーの問題を解決しようとしています。プロデューサ定数はデータをファイルに追加し、コンシューマはこの増大するファイルから読み取ります。通常、ファイル サイズは GB (約 10GB) 単位です。
最初に、BufferedOutputStream と BufferedInputStream を試して、データをファイルに読み書きしました。午前 9 時 30 分に発生するデータのバースト中に、30 ~ 40% (I/O のシステム コールである必要があります) のようにシステム CPU の使用率が高すぎます。
これを高速化するためにメモリマップファイルを調べます。
1) ファイル readThisFile.dat size() が INTEGER.MAX の長さを超えているため、inChannel.map() は例外をスローします。
2) 非常に大きなファイルのメモリ マップド ファイルを使用して、消費者が常にデータを読み取る方法。消費者は毎回 100MB をロードして、さらに多くのデータを探し続けることができますか?
3)Javaでメモリマップファイル以外の何かを試すようなより速い解決策はありますか?
java - マルチスレッドの ByteBuffers はシーケンシャルより遅いですか?
処理する必要がある巨大なバイト配列があります。理論的には、作業を均等にスライスして別のスレッドに割り当て、マルチコア マシンでのパフォーマンスを向上させることができるはずです。
ByteBuffer
各スレッドに を割り当て、それぞれデータの一部を処理しました。8 つの論理プロセッサを使用しているにもかかわらず、最終的なパフォーマンスはシングル スレッドよりも遅くなります。また、非常に矛盾しています。場合によっては、同じ入力の処理が 2 倍以上遅くなることがあります。何故ですか?データは最初にメモリにロードされるため、それ以上のIO
操作は実行されません。
MappedByteBuffer
より高速であるため、次を使用して ByteBuffers を割り当てますByteBuffer.wrap()
。
私は以下を使用して並行処理を行いますExecutors
:
並行タスクperformTask()
は、独自のByteBuffer
インスタンスを使用して、バッファーからメモリを読み取り、計算を実行します。それらは互いに同期したり、書き込みをしたり、影響を与えたりしません。何がうまくいかないのか、またはこれは並列化の良いケースではないのでしょうか?
同じ問題が存在しByteBuffer.wrap()
ますMappedByteBuffer
。
crash - Java 8 アプリケーションがすべてのシステム RAM を使用し、SIGBUS でクラッシュします。何が起きてる?
ネットワーク経由でメッセージを取り込み、Java NIO MappedByteBuffer を使用して複数のメモリ マップ ファイルに書き込む Java 8 アプリケーションがあります。これらのファイルからメッセージを順番に同時に読み取り、MappedByteBuffer を使用して読み取りファイルを再度削除するリーダーがあります。約 246 GB のデータを読み書きし、アプリケーションが次のようにクラッシュするまで、すべてがスムーズです。
はhs_err_pid44460.log
空で、コア ダンプcore.44460
のサイズは約 246 GB で、書き込もうとしているメッセージでいっぱいです。
最大ヒープ サイズ 32 GB で実行しています。JConsole によると、不足してFree Physical Memory
クラッシュします。
RAM が不足しているのはなぜですか? ファイル ハンドルを閉じるのを忘れているのですか / MMapped ファイルを正しく閉じていませんか?
java - Android の高性能ファイル IO
ECG モニターと通信するアプリを作成しています。データは毎秒 250 サンプルの速度で読み取られます。ECG モニターからの各パッケージには 80 バイトが含まれ、これは 1 秒あたり 40 回受信されます。
RandomAccessFile(outputFile, "rws")
RandomAccessFile を使用してみましたが、同期モードと非同期 モードの両方でパッケージが失われました
RandomAccessFile(outputFile, "rw")
。
最近の実験では、MappedByteBuffer を使用してみました。これは非常にパフォーマンスが高いはずですが、バッファーを作成するときにmap(FileChannel.MapMode.READ_WRITE, 0, 10485760)
、10MB バッファーのサイズを指定する必要があります。ただし、これにより、ファイルのサイズは常に 10MB になります。ファイルサイズが保存されている実際のデータ量のみである MappedByteBuffer を使用することは可能ですか?
または、これを達成する別の方法はありますか?これほど頻繁にファイルに書き込むのはナイーブですか?
余談ですが、これは iOS ではまったく問題ではありませんでした。これは、バッファリングなしで実現できます。
cassandra - Cassandra SSTable およびメモリ マップ ファイル
この記事SSTable の観点からの読み取りと書き込み(かなり古い記事です) で、著者は indexdb と sstable ファイルがメモリ マップ ファイルを使用してウォームアップされていると述べています。
各SSTableの行キーはindex.dbという別のファイルに保存され、起動時にCassandraはウォームアップのために「これらのファイルを調べます」。Cassandra はメモリ マップされたファイルを使用するため、起動時にファイルを読み取るときに、それらのファイルへの最初のアクセスがメモリから提供されることが期待されます。
CommitLogSegment では MappedByteBuffer が使用されていますが、SSTable ローダー/リーダーでは使用されていません。また、MappedByteBuffer をファイル チャネルにマッピングするだけでは、ファイルがメモリに読み込まれません。load を明示的に呼び出す必要があると思います。
私の質問は、Cassandra が起動するとき、どのようにウォームアップするのですか? そして、この記事の声明に何か欠けていますか?
android - メモリ マッピング ファイルはメモリ管理に干渉しますか?
メモリ マッピングを使用してファイルにアクセスするアプリを作成しました。読み込み速度が飛躍的に向上したので成功です。
予想どおり、に割り当てられたメモリByteBuffer
は VM ヒープに対してカウントされません。ヒープ ダンプを見ると、アプリが実際よりも大幅に少ないメモリを使用しているように見えます。
私の質問は、この種の割り当てが他のアプリに関連するデバイスのメモリ管理にどのような影響を与えるか (もしあれば) です。 私のアプリは Android エコシステムの「悪い市民」になりますか?