让Python和Java相互配合的最佳方法是什么?
我有点复杂的情况。我会尽力用图片和文字来解释。这是当前的系统架构:
我们有一个用Java编写的基于代理的建模仿真。它可以选择本地写入CSV文件,也可以通过与Java服务器的连接远程写入HDF5文件。每次模拟运行超过一千兆字节的数据,我们运行模拟数十次。我们需要能够聚合同一场景的多次运行(使用不同的随机种子)以查看一些趋势(例如,最小值,最大值,中值,平均值)。可以想象,试图移动所有这些CSV文件是一场噩梦;每次运行都会生成多个文件,就像我说的一些文件非常庞大。这就是我们一直试图转向HDF5解决方案的原因,其中研究的所有数据都存储在一个地方,而不是分散在几十个纯文本文件中。此外,由于它是二进制文件格式,与未压缩的CSVS相比,它应该能够节省大量空间。
如图所示,我们对来自仿真的原始输出数据进行的当前后处理也在Java中进行,并读取由本地输出生成的CSV文件。此后处理模块使用JFreeChart创建与模拟相关的一些图表和图形。
正如我前面提到的,当我们从模拟中生成越来越多的数据时,CSV实际上是站不住脚的,并且不能很好地扩展。此外,后处理代码所做的工作比它本来应该做的更多,基本上执行非常非常差的人的关系数据库的工作(基于外键(唯一的代理ID)在'表'(csv文件)之间进行连接在这个系统中,以其他方式可视化数据也很困难(例如,Prefuse,Processing,JMonkeyEngine在MatLab或SPSS中获取原始数据的一些子集)。
我的小组决定我们真的需要一种过滤和查询我们拥有的数据的方法,以及执行跨表连接。鉴于这是一次写入,多次读取的情况,我们真的不需要真正的关系数据库的开销;相反,我们只需要一些方法在HDF5文件上放置一个更好的前端。我发现了一些关于这方面的文章,例如描述如何使用XQuery as the query language on HDF5 files的文章,但是本文描述了必须编写一个编译器,以便将XQuery / XPath转换为本机HDF5调用,超出了我们的需求。 输入PyTables。它似乎完全符合我们的需要(通过Python列表理解或通过in-kernel (C level) searches提供两种不同的查询数据的方式。
我不确定怎么做的是将为查询而编写的python代码与提供HDF5文件的Java代码以及执行数据后处理的Java代码链接在一起。显然,我会想要重写大部分隐式执行查询的后处理代码,而是让优秀的PyTables更优雅地完成这项工作。
一个简单的谷歌搜索为communicating between Java and Python提供了一些选项,但我对这个主题很新,我正在寻找一些实际的专业知识和批评所提出的架构。似乎Python进程应该与Datahose在同一台机器上运行,这样大的.h5文件就不必通过网络传输,而是将它的小得多的过滤视图传输给客户端。 Pyro似乎是一个有趣的选择 - 有没有人有这方面的经验?
答案 0 :(得分:13)
答案 1 :(得分:5)
不要让它变得比它需要的更复杂。
您的Java进程可以 - 简单地 - 生成一个单独的子进程来运行PyTables查询。让操作系统做最好的操作系统。
您的Java应用程序可以简单地将具有必要参数的进程分叉为命令行选项。然后当Python在后台运行时,你的Java可以继续下一件事。
这在并发性能方面具有巨大优势。您的Python“后端”与Java模拟“前端”同时运行。
答案 2 :(得分:0)
答案 3 :(得分:0)
不确定这是否是礼仪。我无法将所有评论都纳入正常评论中,并且帖子在8个月内没有活动。
只是想看看这对你有什么用?我的工作情况非常非常相似 - 只有模拟用C语言编写,存储格式是二进制文件。每当老板想要一个不同的摘要时,我们必须制作/修改手写代码来做摘要。我们的二进制文件大小约为10 GB,每年的模拟都有一个,所以你可以想象,当我们想用不同的种子运行它时,事情会变得毛茸茸。
我刚刚发现了pyTables并且对你有类似的想法。我希望将我们的存储格式更改为hdf5,然后使用pytables运行我们的摘要报告/查询。部分原因是每年加入表格。你是否有幸使用pytables进行这些类型的“连接”?