【发布时间】:2010-12-29 13:13:56
【问题描述】:
简而言之问题
让 Python 和 Java 相互配合的最佳方式是什么?
更详细的解释
我的情况有点复杂。我会尽量用图片和文字来解释。这是当前的系统架构:
我们有一个用 Java 编写的基于代理的建模模拟。它可以选择在本地写入 CSV 文件,也可以通过与 Java 服务器的连接远程写入 HDF5 文件。每次模拟运行都会产生超过 1 GB 的数据,我们会运行数十次模拟。我们需要能够对同一场景的多次运行(使用不同的随机种子)进行聚合,以查看一些趋势(例如,最小值、最大值、中值、平均值)。可以想象,试图移动所有这些 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 更优雅地完成这件事。
Java/Python 选项
一个简单的谷歌搜索为communicating between Java and Python 提供了一些选项,但我对这个主题太陌生了,所以我正在寻找一些实际的专业知识和对提议的架构的批评。看起来 Python 进程应该与 Datahose 在同一台机器上运行,这样大的 .h5 文件就不必通过网络传输,而是将更小的过滤视图传输给客户端。 Pyro 似乎是一个有趣的选择——有人有这方面的经验吗?
【问题讨论】:
-
我对 Python 的了解不够,无法回答,但我想说这是一个文笔优美的问题。我所能提供的只是一个建议,如果您使用 Jython,您可以从 Python 调用 Java 代码和库,我相信 Jython 代码也可以从 Java 调用。此外,虽然 HDF5 是为大型数据集设计的一种出色的格式,但如果您的数据是真正的关系型数据并且您的分析很复杂,那么数据库对于简化 SQL 查询仍然更有意义。
-
+1 个很好的问题,非常清楚
-
...也许是一个幼稚的问题,但为什么必须让 Java 与 Python 交互呢?您似乎有一个很好的分层架构,它提供了一个由您的 HDF5 文件表示的数据接口。从你的问题中我不清楚你想从 Python 中用 Java 做什么 - 反之亦然 - 以及为什么。
-
关系数据库不必有很高的开销。你看过类似 SQLite 的东西吗?
-
Re: Ichorus:如果 HDF5 数据软管计划失败,我曾建议使用像 SQLite 这样的 RDBMS,但我们从来没有到实现它来查看它的性能的地步。当我们不需要任何行级锁定或事务功能的完整 RDBMS 时,这似乎有点矫枉过正
标签: java python architecture hdf5 pytables