Python、PyTables、Java将所有这些绑定在一起

2024-05-14 11:00:07 发布

您现在位置:Python中文网/ 问答频道 /正文

简单的问题

让Python和Java更好地相互配合的最佳方法是什么?在

更详细的解释

我的情况有点复杂。我会尽量用图片和文字来解释。以下是当前的系统架构:

Current system architecture

我们有一个用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)。在

我设想的架构是: Envisioned architecture

我不确定如何将编写用于查询的python代码与提供HDF5文件的Java代码以及对数据进行后期处理的Java代码链接在一起。显然,我希望重写大量隐式执行查询的后处理代码,而让优秀的pytable更优雅地完成这项工作。在

Java/Python选项

一个简单的google搜索会为communicating between Java and Python找到一些选项,但是我对这个主题太陌生了,所以我正在寻找一些对拟议架构的实际专业知识和批评。在网络上传输的数据应该和在网络上运行的主机上传输的数据一样多,但它应该不会被过滤掉。Pyro似乎是一个有趣的选择-有人有这方面的经验吗?在


Tags: 文件csv数据方法代码架构系统文章
3条回答

您可以试试Jython,一个用于JVM的Python解释器,它可以importJava类。在

Jython project homepage

不幸的是,关于这个问题我只知道这些。

这是一个史诗般的问题,有很多考虑因素。既然您没有提到任何具体的性能或架构限制,我将尽力提供最好的全面建议。在

使用PyTables作为其他元素和数据文件之间的中间层的最初计划似乎很可靠。然而,没有提到的一个设计约束是所有数据处理中最关键的一个:这些数据处理任务中哪些可以以批处理方式完成,哪些数据处理任务更像是一个实时流。在

“我们确切地知道我们的输入和输出,并且可以只进行处理”(批处理)和“我们知道我们的输入和需要什么可以让其他人去问”(live)之间的这种区别使得架构问题变得完全不同。看看你的图表,有几个关系暗示了不同的处理风格。在

此外,在图表中,不同类型的组件都使用相同的符号。这使得分析预期的性能和效率有点困难。在

另一个重要的约束是您的IT基础设施。你有高速网络存储吗?如果这样做,中间文件将成为一种出色、简单、快速的方法,可以在基础结构的元素之间共享数据,以满足所有批处理的需要。您提到过在运行Java模拟的服务器上使用应用程序运行PyTables。但是,这意味着服务器在写入和读取数据时都会遇到负载。(也就是说,当不相关的软件查询数据时,可能会影响到仿真环境。)

直接回答您的问题:

  • PyTables看起来很匹配。在
  • Python和Java的通信方式有很多种,但是考虑一种与语言无关的通信方法,这样以后就可以对这些组件进行必要的更改。这就像找到同时支持Java和Python的库并尝试它们一样简单。不管怎样,你选择用任何库实现的API都应该是相同的。(XML-RPC对于原型制作来说很好,因为它在标准库中,谷歌的协议缓冲区或Facebook的Thrift都是很好的产品选择。但是,不要低估如果数据是可预测的和可批处理的,那么“将内容写入中间文件”是多么的伟大和简单。在

为了更好地帮助设计过程并充实您的需求:

我们很容易从谜团中找出一小部分,做出一些合理的假设,然后跳入解决方案评估。但最好是在清楚了解自己的限制条件的情况下,全面地看待问题。我可以建议这个过程:

  • 创建当前架构的两个图表,物理和逻辑。
    • 在物理图上,为每个物理服务器创建框,并绘制每个物理服务器之间的物理连接。
      • 一定要标记每个服务器可用的资源以及每个连接可用的类型和资源。在
      • 如果可能有用,请包括当前设置中未涉及的物理硬件。如果您不想使用SAN解决方案,则可能需要它
    • 在逻辑图上,为当前体系结构中运行的每个应用程序创建框。
      • 在应用程序框中包含相关的库。(这一点很重要,因为您的未来解决方案关系图当前将PyTables作为一个框,但它只是一个库,不能独立执行任何操作。)
      • 利用磁盘资源(如HDF5和CSV文件)作为柱面。在
      • 根据需要,用箭头将应用程序连接到其他应用程序和资源。总是从“演员”到“目标”画箭头。所以如果app写入和HDF5文件,它们的箭头从应用程序转到文件。如果应用程序读取CSV文件,则箭头将从应用程序指向该文件。在
      • 每个箭头都必须标有通信机制。未标记的箭头表示关系,但它们不显示什么关系,因此它们不会帮助您做出决策或传达约束。在

一旦你完成了这些图表,做几份副本,然后在上面开始做数据流涂鸦。对于每个需要原始数据的“端点”应用程序,都有一个图表的副本,从模拟开始,在终点处用一个非常坚实的流动箭头结束。每当数据箭头流过通信/协议箭头时,请记下数据是如何变化的(如果有的话)。在

在这一点上,如果您和您的团队都同意纸面上的内容,那么您已经以一种可以轻松传达给任何人的方式解释了您当前的体系结构。(不仅仅是stackoverflow上的助手,还有老板、项目经理和其他钱包持有者。)

要开始规划您的解决方案,请查看数据流图,并从端点反向工作到起始点,然后创建一个嵌套列表,其中包含返回到起点的每个应用程序和中介格式。然后,列出每个应用程序的要求。确保具有以下特征:

  • 此应用程序可以使用哪些数据格式或方法进行通信。在
  • 它到底想要什么数据。(这是一直不变的还是它会根据其他要求在一时兴起的情况下改变?)在
  • 它多久需要一次。在
  • 应用程序大约需要多少资源。在
  • 应用程序现在做什么,它做得不好。在
  • 这个应用程序现在可以做些什么来帮助你,但是它没有做什么。在

如果你对这个列表做得很好,你可以看到这将如何帮助你定义你选择的协议和解决方案。您可以查看数据穿过通信线路的情况,然后比较通信双方的需求列表。在

您已经描述了一个特定的情况,其中有相当多的java后处理代码正在对CSV文件中的数据表执行“联接”,即“现在就做,但做得不好”。所以你看看沟通的另一面,看看对方是否能做好这件事。在这一点上,另一面是CSV文件,在此之前是模拟,所以不,在当前的体系结构中没有什么可以做得更好。在

因此,您提出了一个新的Python应用程序,它使用PyTables库来改进该过程。听起来不错!但是在下一个图中,您添加了一些与“PyTables”相关的其他东西。现在我们已经超出了StackOverflow团队的理解,因为我们不知道其他应用程序的需求。但是如果你制作了上面提到的需求列表,你就会知道该考虑什么。也许您的Python应用程序使用PyTables来提供对HDF5文件的查询,可以支持所有这些应用程序。也许它只能支持其中的一个或两个。它可能会向后处理器提供实时查询,但会定期为其他应用程序编写中间文件。我们说不清,但有计划,你可以。在

一些最终指南:

  • 保持简单!这里的敌人是复杂性。您的解决方案越复杂,实现该方案的难度就越大,失败的可能性也就越大。使用最少数量的运算,使用最少复杂的运算。有时候,只需一个应用程序来处理架构中所有其他部分的查询是最简单的。有时处理“实时”查询的应用程序和处理“批处理请求”的单独应用程序更好。
  • 保持简单!这是一件大事!不要写任何已经可以为你做的事情。(这就是为什么中间文件如此强大,操作系统可以处理所有困难的部分。)此外,您提到了关系数据库的开销太大,但是考虑到关系数据库还附带了一种非常有表现力和广为人知的查询语言,即与之配套的网络通信协议,开发任何东西来使用它!无论你提出什么解决方案,都必须比使用现成的解决方案更好,当然,非常好,否则它不是最好的解决方案。在
  • 经常参考物理层文档以便了解您考虑的资源使用情况。一个缓慢的网络链接或者在一台服务器上放太多的东西都会排除其他好的解决方案。在
  • 保存这些文档。无论您做出什么决定,您在流程中生成的文档都是有价值的。把它们放在维基上或者归档,这样当话题出现时,你就可以把它们再抽出来。在

直接问题的答案是“如何让Python和Java更好地结合在一起?”简单地说就是“使用一种语言无关的通信方法”。事实上,Python和Java对你描述的问题集都不重要。重要的是流经它的数据。任何能够轻松有效地共享数据的东西都会很好。在

不要让这件事变得更复杂。在

Java进程可以——简单地——生成一个单独的子进程来运行PyTables查询。让操作系统做操作系统最擅长的事情。在

Java应用程序可以简单地派生一个进程,该进程具有必要的参数作为命令行选项。然后,当Python在后台运行时,Java可以继续进行下一步工作。在

这在并发性能方面具有巨大的优势。Python“后端”与Java模拟“前端”同时运行。在

相关问题 更多 >

    热门问题