Linux (CentOS) で Java と C++ プログラム間で大量のデータを転送する必要があります。パフォーマンスが最初の関心事です。最良の選択は何ですか?RAMDisk (/dev/shm/) またはローカルソケット?
1 に答える
ソケットは、データの送信が完了する前に相手側が (別の CPU コアで) データの処理を開始できるため、最速です。
100KB のデータを送信すると、相手側は数キロバイトを受信するとすぐに処理を開始できます。そして、100KB をすべて送信した時点で、おそらく 90KB 程度の処理が終了しているので、残りは 10KB しかありません。
RAM ディスクでは、データの処理を開始する前に 100KB 全体を書き込む必要があります。両端がほぼ同じ量の作業を行う必要があると仮定すると、RAM ディスクよりもソケットを使用する方が約 10 倍速くなります。
おそらく、100KB を RAM ディスクに書き込むのに 1 ミリ秒かかり、それを処理するのに 1 ミリ秒かかります。ソケットでは、データを送信するのに 1 ミリ秒かかりますが、すべてのデータが送信された後、処理を完了するのに 0.1 ミリ秒しかかかりません。
送信されるデータ量が多いほど、ソケットのパフォーマンスが向上します。すべてのデータを書き込むのに 10 秒、すべてのデータが送信された後、処理を完了するのにさらに 0.1 ミリ秒かかります。
ただし、RAM ディスクの方が操作が簡単です。ソケットはデータのストリームを使用するため、コードの記述とデバッグ/テストの点で時間がかかります。
また、RAM ディスクが必要であると想定しないでください。オペレーティング システムがどのように構成されているかによって、100MB を回転プラッター ハード ドライブに書き込むと、単純に RAM キャッシュに書き込んでから、後でハード ドライブに書き込むことができます。データがHDDに書き込まれるのを待たずに、一時RAMキャッシュからすぐに読み取ることができます。パフォーマンスを推測する前に、必ずテストを行ってください。HDD は RAM よりも遅いと想定しないでください。自動的に最適化される可能性があるためです。
私がこれを入力している Mac は、CentOS と同じように UNIX であり、現在、近い将来のある時点で読み取ると推測されるファイルのコピーを保持するための専用の約 8GB の RAM を備えています。RAM ディスクを手動で作成する必要はなく、ヒューリスティックに RAM に配置するだけでした。CentOS も同じようなことをするので、テストして実際の速さを確認する必要があります。
ただし、処理を開始するためにすべてのデータを書き込む必要がないため、ソケットは間違いなく最速のオプションです。