让Python和Java更好地相互配合的最佳方法是什么?在
我的情况有点复杂。我会尽量用图片和文字来解释。以下是当前的系统架构:
我们有一个用Java编写的基于agent的建模仿真。它可以选择本地写入CSV文件,也可以通过Java服务器到HDF5文件的连接远程写入。每次模拟运行都会输出超过1GB的数据,我们会运行模拟几十次。我们需要能够对同一场景的多个运行进行聚合(使用不同的随机种子),以便看到一些趋势(例如最小值、最大值、中值、平均值)。正如您所想象的,尝试移动所有这些CSV文件是一场噩梦;每次运行都会生成多个文件,就像我说的,其中一些文件非常庞大。这就是为什么我们一直在努力向HDF5解决方案迈进,在这个方案中,研究的所有数据都存储在一个地方,而不是分散在几十个纯文本文件中。此外,由于它是二进制文件格式,与未压缩的csv相比,它应该能够节省大量空间。在
如图所示,当前我们对模拟的原始输出数据所做的后处理也在Java中进行,并读取本地输出生成的CSV文件。这个后处理模块使用JFreeChart创建一些与仿真相关的图表。在
正如我在前面提到的,csv确实是站不住脚的,而且随着我们从模拟中生成越来越多的数据,它们的扩展性也不好。此外,后处理代码做的比它应该做的还要多,基本上是执行一个非常非常差的人的关系数据库的工作(基于外键(唯一的代理ID)在“表”(csv文件)之间进行连接)。在这个系统中,也很难以其他方式可视化数据(例如预处理、处理、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代码链接在一起。显然,我希望重写大量隐式执行查询的后处理代码,而让优秀的pytable更优雅地完成这项工作。在
一个简单的google搜索会为communicating between Java and Python找到一些选项,但是我对这个主题太陌生了,所以我正在寻找一些对拟议架构的实际专业知识和批评。在网络上传输的数据应该和在网络上运行的主机上传输的数据一样多,但它应该不会被过滤掉。Pyro似乎是一个有趣的选择-有人有这方面的经验吗?在
您可以试试Jython,一个用于JVM的Python解释器,它可以
import
Java类。在Jython project homepage
不幸的是,关于这个问题我只知道这些。
这是一个史诗般的问题,有很多考虑因素。既然您没有提到任何具体的性能或架构限制,我将尽力提供最好的全面建议。在
使用PyTables作为其他元素和数据文件之间的中间层的最初计划似乎很可靠。然而,没有提到的一个设计约束是所有数据处理中最关键的一个:这些数据处理任务中哪些可以以批处理方式完成,哪些数据处理任务更像是一个实时流。在
“我们确切地知道我们的输入和输出,并且可以只进行处理”(批处理)和“我们知道我们的输入和需要什么可以让其他人去问”(live)之间的这种区别使得架构问题变得完全不同。看看你的图表,有几个关系暗示了不同的处理风格。在
此外,在图表中,不同类型的组件都使用相同的符号。这使得分析预期的性能和效率有点困难。在
另一个重要的约束是您的IT基础设施。你有高速网络存储吗?如果这样做,中间文件将成为一种出色、简单、快速的方法,可以在基础结构的元素之间共享数据,以满足所有批处理的需要。您提到过在运行Java模拟的服务器上使用应用程序运行PyTables。但是,这意味着服务器在写入和读取数据时都会遇到负载。(也就是说,当不相关的软件查询数据时,可能会影响到仿真环境。)
直接回答您的问题:
为了更好地帮助设计过程并充实您的需求:
我们很容易从谜团中找出一小部分,做出一些合理的假设,然后跳入解决方案评估。但最好是在清楚了解自己的限制条件的情况下,全面地看待问题。我可以建议这个过程:
一旦你完成了这些图表,做几份副本,然后在上面开始做数据流涂鸦。对于每个需要原始数据的“端点”应用程序,都有一个图表的副本,从模拟开始,在终点处用一个非常坚实的流动箭头结束。每当数据箭头流过通信/协议箭头时,请记下数据是如何变化的(如果有的话)。在
在这一点上,如果您和您的团队都同意纸面上的内容,那么您已经以一种可以轻松传达给任何人的方式解释了您当前的体系结构。(不仅仅是stackoverflow上的助手,还有老板、项目经理和其他钱包持有者。)
要开始规划您的解决方案,请查看数据流图,并从端点反向工作到起始点,然后创建一个嵌套列表,其中包含返回到起点的每个应用程序和中介格式。然后,列出每个应用程序的要求。确保具有以下特征:
如果你对这个列表做得很好,你可以看到这将如何帮助你定义你选择的协议和解决方案。您可以查看数据穿过通信线路的情况,然后比较通信双方的需求列表。在
您已经描述了一个特定的情况,其中有相当多的java后处理代码正在对CSV文件中的数据表执行“联接”,即“现在就做,但做得不好”。所以你看看沟通的另一面,看看对方是否能做好这件事。在这一点上,另一面是CSV文件,在此之前是模拟,所以不,在当前的体系结构中没有什么可以做得更好。在
因此,您提出了一个新的Python应用程序,它使用PyTables库来改进该过程。听起来不错!但是在下一个图中,您添加了一些与“PyTables”相关的其他东西。现在我们已经超出了StackOverflow团队的理解,因为我们不知道其他应用程序的需求。但是如果你制作了上面提到的需求列表,你就会知道该考虑什么。也许您的Python应用程序使用PyTables来提供对HDF5文件的查询,可以支持所有这些应用程序。也许它只能支持其中的一个或两个。它可能会向后处理器提供实时查询,但会定期为其他应用程序编写中间文件。我们说不清,但有计划,你可以。在
一些最终指南:
直接问题的答案是“如何让Python和Java更好地结合在一起?”简单地说就是“使用一种语言无关的通信方法”。事实上,Python和Java对你描述的问题集都不重要。重要的是流经它的数据。任何能够轻松有效地共享数据的东西都会很好。在
不要让这件事变得更复杂。在
Java进程可以——简单地——生成一个单独的子进程来运行PyTables查询。让操作系统做操作系统最擅长的事情。在
Java应用程序可以简单地派生一个进程,该进程具有必要的参数作为命令行选项。然后,当Python在后台运行时,Java可以继续进行下一步工作。在
这在并发性能方面具有巨大的优势。Python“后端”与Java模拟“前端”同时运行。在
相关问题 更多 >
编程相关推荐