私はJavaで参照する記述を読んでいましたが、私はそれらを理解していると感じましたが、Javaで以下のことができるかどうかはわかりません。ソケットを介して通信する同じJVM内に2つのスレッドがあり、データ自体をコピーせずに、ソケット全体にある大量のデータのアドレスを本質的に渡したいと考えています。解決策は、明らかに始まったかもしれませんが、私はそれを理解することはできません!ヘルプをいただければ幸いです。(大)データ領域への参照をソケットに渡す
答えて
このソケットでは他にどのような移動がありますか?それがあなた自身のプロトコルであれば、 "既知の場所から大きなものを得る"という動詞をプロトコルに追加し、動詞を送信します。これらのオブジェクトはどれくらいありますか?マップ文字列、オブジェクトを作成して、文字列をソケットに渡すことはできますか?
実際に私はそれが好きです!ありがとう!私は何年か前に別の環境でやったことを思い出させます - なぜ私はそれを考えなかったのでしょうか?-) –
JNIを使用すると可能かもしれませんが、純粋なJavaでは可能ではないと思います。
同じJVM内にあることを考えれば(メモリマップファイルを使用しない限り、それを動作させる唯一の機会です)、本当にソケットを使用する必要がありますか?より "直接的な" APIを作成できませんか?
これには2通りの方法があります。
- 後で取り出せるグローバルな場所に参照を置きます。シリアライズされたときにグローバルにアクセスする参照に解決されるオブジェクトをソケット経由で送信します。 (同じJVMでのみ動作します)
- RMIを介して大きなオブジェクトにアクセスできるようにします。直列化するとラージオブジェクトにRMIプロキシを作成するオブジェクトを送信します。
より効率的で簡単な直接APIを使用します。私はBlockingQueueを検討することをお勧めします。
AFAIK Javaはオブジェクトのメモリ参照を取得する手段を提供しません。しかし、共有配列または共有ベクトルを使用して、データをオブジェクトとしてベクター/配列に配置し、オブジェクトのインデックスをソケットに渡すことができます。
同じプログラムの2つのスレッド間でデータを渡す場合は、java.concurrentパッケージの任意のチャネルを介してその領域への参照を渡すことができます。
2つの別々のプログラムを実行している場合は、データをシリアル化する必要があります(実際にデータ自体を渡す必要がある場合)。
データへのアクセスのみが必要な場合は、RMIを使用して目的の変換を実行するサービスを公開できます。
- 1. 参照領域多次元配列
別のクラスローダーなど、何らかの仕方でコンポーネントの2つのソケットがありますか?これは、異なるホスト上で通常動作する2つのプログラムが同じプロセスで実行されている特殊なケースの最適化ですか?私は、通常のパラメータの受け渡しがなぜオプションでないのだろうと思っています。 – erickson
ここに良い提案の束!みんな、ありがとう! –