一言で言えば質問
Python と Java をうまく連携させる最善の方法は何ですか?
より詳しい説明
私はやや複雑な状況にあります。写真と言葉の両方で説明できるように最善を尽くします。現在のシステム アーキテクチャは次のとおりです。
Java で記述されたエージェントベースのモデリング シミュレーションがあります。ローカルで CSV ファイルに書き込むか、Java サーバーへの接続を介してリモートでHDF5に書き込むオプションがあります。ファイル。シミュレーションを実行するたびに、ギガバイトのデータが吐き出され、シミュレーションを何十回も実行します。いくつかの傾向 (例: 最小、最大、中央値、平均) を確認するために、同じシナリオ (異なるランダム シードを使用) の複数の実行にわたって集計できる必要があります。ご想像のとおり、これらすべての CSV ファイルを移動しようとするのは悪夢です。実行ごとに複数のファイルが生成されます。前述のように、そのうちのいくつかは巨大です。これが、私たちが HDF5 ソリューションに移行しようとしてきた理由です。HDF5 ソリューションでは、スタディのすべてのデータが、数十のプレーン テキスト ファイルに分散するのではなく、1 か所に保存されます。さらに、これはバイナリ ファイル形式であるため、圧縮されていない CSVS と比較して大幅にスペースを節約できるはずです。
図が示すように、シミュレーションからの生の出力データに対して行う現在の後処理も Java で行われ、ローカル出力によって生成された CSV ファイルを読み込みます。この後処理モジュールは、JFreeChart を使用して、シミュレーションに関連するいくつかのチャートとグラフを作成します。
問題
前に触れたように、CSV は本当に受け入れがたいものであり、シミュレーションからますます多くのデータを生成するにつれてうまくスケーリングできません。さらに、後処理コードは必要以上のことを行っており、基本的に非常に貧弱な人間のリレーショナル データベースの作業を実行しています (外部キー (一意のエージェント IDこのシステムでは、他の方法でデータを視覚化することも困難です (たとえば、Prefuse、Processing、JMonkeyEngine が生データのサブセットを取得して、MatLab または SPSS で操作します)。
解決?
私のグループは、クロス テーブル結合を実行するだけでなく、データをフィルター処理してクエリを実行する方法が本当に必要であると判断しました。これが一度だけ書き込み、何度も読み取る状況であることを考えると、実際のリレーショナル データベースのオーバーヘッドはまったく必要ありません。代わりに、HDF5 ファイルのフロント エンドを改善する何らかの方法が必要です。HDF5 ファイルで XQuery をクエリ言語として使用する方法を説明している論文など、これに関するいくつかの論文を見つけましたが、その論文では、XQuery/XPath からネイティブの HDF5 呼び出しに変換するコンパイラを作成する必要があり、私たちのニーズをはるかに超えていると説明されています。PyTablesと入力します。それはまさに私たちが必要とすることをしているようです (Python リスト内包表記またはカーネル内 (C レベル) 検索のいずれかを使用して、データを照会する 2 つの異なる方法を提供します。
どうすればよいかよくわかりませんが、クエリ用に作成される Python コードと、HDF5 ファイルを提供する Java コード、およびデータの後処理を行う Java コードをリンクすることです。明らかに、暗黙的にクエリを実行している後処理コードの多くを書き直し、代わりに優れた PyTable にこれをよりエレガントに実行させたいと考えています。
Java/Python オプション
簡単な Google 検索で Java と Python の間の通信に関するいくつかのオプションが見つかりますが、私はこのトピックに慣れていないので、提案されたアーキテクチャーに関する実際の専門知識と批判を探しています。大規模な .h5 ファイルをネットワーク経由で転送する必要がないように、Python プロセスは Datahose と同じマシンで実行する必要があるように思われます。 Pyroは興味深い選択のようです。経験のある人はいますか?