结合 Java、Python、PyTables 和 HDF5 的简单有效的解决方案

Posted

技术标签:

【中文标题】结合 Java、Python、PyTables 和 HDF5 的简单有效的解决方案【英文标题】:Simple and effective solution for combining Java, Python, PyTables and HDF5 【发布时间】:2012-02-12 19:53:50 【问题描述】:

我是 Python、PyTables 和 HDF5 的新手。我正在为我的问题寻找简单和最佳的解决方案。

问题是下一个。一方面,我有许多带有数据的 XML 文件。我只想解析这些文件并将数据放在另一端的 hdf5 文件中。稍后,我将通过一些搜索条件使用这些数据。为什么是 HDF5?因为需要放置大型数据集并且因为速度。使用 RDBMS 会在 JOIN 操作期间产生性能问题。解决方案必须提供速度和良好的内存性能。

经过一番谷歌搜索后,我发现 Python 和 PyTables 是可能的解决方案。我的想法是在 Java 中解析 XML 中的数据(此代码必须用 Java 编写),然后编写 python 脚本,使用 PyTables API 在 hdf5 中插入数据并从 Java 执行 python 脚本。所以,我正在从 Java 程序编写和执行 python 脚本。为了在 Java 中编写 python 脚本,我使用 java.io.* 包并在 Java 中执行 Process 类。例如:

p.exec("cmd /c C:\MyScripts\myscript.py")

我不知道这个解决方案好不好。对我来说,使用 java.io.* 从 Java 编写脚本并不酷。可能,我稍后在从脚本读取结果时会遇到问题(当我使用 Python 脚本和 PyTables API 制定一些搜索条件时)。

所以,我对我的问题没有几个问题。在一侧解析 XML 数据并将数据存储在另一侧的 hdf5 之间的最佳解决方案是什么?我对这个解决方案的正确方式(从 Java 代码编写和执行 python 脚本)? Python 和 PyTables 呢?这些技术能很好地解决我的问题吗?我还阅读了一些关于 Jython 的内容,但我不知道是否可以将它与 PyTables 结合使用?

欢迎专业人士提出意见和建议。感谢您的帮助。

【问题讨论】:

出于模糊的好奇心,为什么必须用 Java 编写 XML 代码? Python 有很多优秀的 xml 解析/编写库。如果您真的想使用 PyTables,将所有内容移至 python 似乎更容易...... 是的,你没事。我没有考虑到这一点,因为对 python 没有太多经验。另外,我正在做一个大项目的一小部分,我不确定我是否有权使用 python 进行解析,但我认为这不是问题。感谢您的建议。 【参考方案1】:

对我来说,使用 java.io.* 从 Java 编写脚本并不酷。

这里也一样——你已经将 XML 中的数据解析为 Java 中的某种内部表示,然后将这些数据重新写入 Python 脚本,然后 Python 解释器会将数据重新解析为内部用于写入 HDF5 文件的表示形式。它将 Java XML 解析接口、XML 数据格式和用于操作 HDF5 文件的 Python API 结合在一起,这听起来像是比应有的更多的移动部分。 (你真的想要打破javac只是为了更新一个重命名的Python包吗?)

我认为值得再退一步,看看问题的两个步骤:

解析 XML 写入 HDF5

没有理由在这两种语言之间存在两种语言——我会完全坚持使用 Java 或完全使用 Python。最终结果将在更多系统上以更少的内存运行得更快,并且无论您选择哪种语言都更易于维护。

【讨论】:

就像我之前提到的,我没有使用 HDF5 的经验。也许更好的解决方案是为 HDF5 使用一些 JAVA API 而不是 PyTables,但我不知道它是否提供与使用 Python 和 PyTables 相同的性能。请注意,我将在未来对 HDF5 中的数据进行大量查询,为此我需要速度。那么,适用于 HDF5 还是 PyTables 的 Java API?什么是更好的解决方案?还是别的什么? 使用最方便编写的任何工具将数据转换为 HDF5 后,请随意使用最方便的任何语言编写查询。您可以完全用 Java 编写导入器,完全用 Python 编写查询,或者反过来——将两者结合到一个程序中,构建完成另一半工作的脚本,这是我真正担心的高度不可维护的问题。 【参考方案2】:

我从事的一个项目是解析大约 60 000 个 Python cPickle 文件并将内容(大约 31k 行和 4 列的矩阵)放入单独的 PyTables 表中。 它的工作原理和性能都非常好。

但我同意萨诺德的观点。无论您拥有最丰富的经验和最熟悉的方式,我都会坚持使用 java 或 python。我确实认为使用 python 和 pytables 更容易获得结果,尤其是在编写导入脚本时。

顺便说一句,您想从 java 运行 python 脚本的原因是什么?为什么不直接运行python脚本呢?

顺便说一句,还有比 PyTables 更低级别的 python h5py 包。 PyTables 实际上在 HDF5 之上构建了一个额外的抽象层。例如,PyTables 有表的概念,类似于 RDBMS 中的表并支持索引(HDF5 开箱即用都不支持)

理论上,您可以从 Java 中读取使用 PyTables 创建的 HDF5 文件。但是,您不会对所有 PyTable 功能(如表和索引)提供开箱即用的支持。 除此之外,如果您在 PyTables 中使用 Blosc 压缩算法,您可能根本无法在 Java 中加载它。

【讨论】:

写入过程必须是自动的,当我用 Java 解析 xml 文件时,我必须运行脚本以在 hdf5 中插入数据。也许更好的解决方案是用 python 解析 XML 文件并从所有进程中排除 Java?我决定使用 Java 来解析 XML,因为我不太了解 python,但这不是我会弄清楚的问题。否则,当我读取数据时,我会进行很多不同的查询。我的计划是使用来自 hdf5 的数据进行一些分析。昨天我读到了 Java HDF5 API,但我对功能不满意。 PyTables 为探索和搜索数据提供了简单而漂亮的 API。也更快。 我会推荐使用 python 和 pytables。在 python 中编写 XML 解析器真的超级容易,而且 pytables 的 API 真的很方便。例如,您可以将 ipython 与 pytables 一起使用,它可以让您完成代码并允许您轻松浏览 hdf5。如果您进行查询,请确保使用 pytables 2.3,因为它支持创建索引,从而大大提高了查询的性能。此外,如果您有大量数据,请确保使用压缩(首选 blosc),这可以进一步提高性能 我会考虑的。感谢您的建议。

以上是关于结合 Java、Python、PyTables 和 HDF5 的简单有效的解决方案的主要内容,如果未能解决你的问题,请参考以下文章

PyTables 之外的 CArray 和 EArray 兼容性

Python pandas 'HDFStore requires PyTables' Issue

python3.5 ImportError HDFStore需要PyTables没有名为表的模块[重复]

python 来自http://www.pytables.org/usersguide/introduction.html

使用python(numpy memmap,pytables或其他?)对巨大矩阵进行快速下采样

pytables 的 DLL 加载失败