問題タブ [bytebuffer]
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 - Bytebuffers と NIO を使用しているときに OutOfMemoryError を回避するにはどうすればよいですか?
ByteBuffers
およびを使用しFileChannels
て、バイナリ データをファイルに書き込みます。大きなファイルに対して、または複数のファイルに対して連続してそれを行うと、OutOfMemoryError
例外が発生します。Bytebuffers
NIO での使用は壊れており、避けるべきであることを他の場所で読みました。すでにこの種の問題に直面していて、大量のバイナリ データを Java のファイルに効率的に保存するための解決策を見つけた人はいますか?
jvm オプションを使用-XX:MaxDirectMemorySize
する方法はありますか?
java - ByteBuffer の内容を OutputStream に入れる方法は?
a の内容を に入れる必要がありjava.nio.ByteBuffer
ますjava.io.OutputStream
。(Channel
代わりに があればいいのですが、ありません) これを行う最善の方法は何ですか?
ByteBuffer のarray()
メソッドは読み取り専用のバッファになる可能性があるため、使用できません。
また、この ByteBuffer を使用してから、直接byte[]
使用できる通常の配列を取得するまでの間に、OutputStream への書き込みを散在させることもできOutputStream.write()
ます。
java - 長さが unsigned int である ByteBuffer から UTF-8 文字列を読み取る
java.nio.ByteBuffer を介して UTF8 文字列を読み込もうとしています。サイズは unsinged int であり、もちろん Java にはありません。値を取得できるように、値を long に読み込みました。
私が抱えている次の問題は、long を使用してバイト配列を作成できないことです。long を int にキャストすると、署名されます。
また、バッファで limit() を使用してみましたが、これも int not long で動作します。
私が行っている特定のことは、クラスファイルから UTF8 文字列を読み取ることです。そのため、バッファーには UTF8 文字列だけではありません。
ByteBuffer から unsigned int の潜在的な長さを持つ UTF8 文字列を読み取る方法に関するアイデア。
編集:
問題の例を次に示します。
そのため、技術的な観点から言えば、クラス ファイル内に完全な u4 (符号なし、4 バイト) の長さの文字列を含めることができます。
UTF8 文字列のサイズに制限がある場合、これらは問題になりません (私は UTF8 の専門家ではないので、おそらくそのような制限があるでしょう)。
私はただそれをパントして、それほど長いストリングが存在しないという現実を受け入れることができました...
java - ByteBuffer クラスの拡張
ByteBuffer クラスを拡張するクラスを作成する方法はありますか?
ByteBuffer の一部の抽象メソッドはパッケージ プライベートであり、パッケージ java.nio を作成すると、セキュリティ例外がスローされます。
パフォーマンス上の理由からこれを行いたいと思います。たとえば、getInt には約 10 のメソッド呼び出しと、かなりの数の if があります。すべてのチェックが残され、メソッド呼び出しのみがインライン化され、ビッグ/スモール エンディアン チェックが削除された場合でも、私が作成したテストでは、約 4 倍高速になることが示されています。
java - CへのJavaバイトバッファ
Windows 上の C プログラムから、バイナリを BIG_ENDIAN に格納する Java バイトバッファのように読み書きする必要があります。
アルゴリズムについては、http: //mindprod.com/jgloss/binaryformats.htmlで説明されています。
int と float を読み書きする必要があります。
これまたは参照を行うcまたはC++コードの例はありますか?
ティア、バート
java - Process stdoutInputStreamをNIOByteBufferに読み込むことは可能ですか?
NIOを使用してプロセスからstdoutを処理することは可能ですか?私はそれをjava.ioで動作させていますが、これはNIOについてもう少し学び、パフォーマンスの向上の可能性を探求するための演習のようなものです。
基本的に、大量のテキストをstdoutからバッファにブロックせずにできるだけ速くストリーミングし、後でそのバッファの内容を処理したいと思います。問題は、NIOで動作させるための適切なブードゥーを理解できないようです。これが私が今いるところです:
StreamConsumerクラスは次のようになります。
java - 大きなByteBuffer用のBufferedReader?
最初に文字列に変換せずに、BufferedReaderを使用してByteBufferを読み取る方法はありますか?かなり大きなByteBufferをテキスト行として読みたいのですが、パフォーマンス上の理由から、ディスクへの書き込みは避けたいと思います。結果の文字列が大きすぎるため、ByteBufferでtoStringを呼び出すことはできません(java.lang.OutOfMemoryError:Javaヒープスペースがスローされます)。APIに適切なリーダーでByteBufferをラップする何かがあると思っていたのですが、適切なものが見つからないようです。
これが私がしていることを示す省略されたコードサンプルです):
java - 最大のデータセットに適合するJAVANIOByteBufferの割り当て?
私はオンラインゲームに取り組んでおり、サーバー側で作業しているときに少し問題が発生しました。
Javaでノンブロッキングソケットを使用する場合、すべてのデータが利用可能になるまで処理できない完全なパケットデータセットを処理するための最善のアクションは何ですか?たとえば、大きな2Dタイルマップをソケット経由で送信します。
私はそれを処理する2つの方法を考えることができます:
私の例の大きな2Dタイルマップを処理するために必要な完全なデータセットを処理するのに十分な大きさのByteBufferを割り当てます。すべてが受信され、そこから処理されるまで、読み取りデータをバッファーに追加し続けます。
ByteBufferのサイズが小さい場合(おそらく1500)、ファイルから完全に処理できるようになるまで、後続の読み取りを実行してファイルに出力できます。これにより、大きなByteBufferを使用する必要がなくなりますが、ディスクI/Oが原因でパフォーマンスが低下します。
すべてのSocketChannelに専用のByteBufferを使用しているので、処理が完了するまでデータを読み込み続けることができます。問題は、2Dタイルマップのサイズが2MBの場合、1000個の2MB ByteBufferを使用するのが本当に賢明ですか(1000がクライアント接続の制限であり、それらがすべて使用されていると仮定)?私が考えていないより良い方法があるに違いありません。
私は物事をシンプルに保ちたいと思いますが、私はどんな提案にもオープンであり、助けに感謝します。ありがとう!