简单有效的Java、Python、PyTables与HDF5结合方案

2 投票
2 回答
1691 浏览
提问于 2025-04-17 10:29

我刚开始学习Python、PyTables和HDF5,想找到一个简单又好的解决方案来解决我的问题。

我的问题是这样的:我有很多XML文件,里面存着数据。我想把这些文件里的数据解析出来,然后放到另一个HDF5文件里。之后,我会通过一些搜索条件来使用这些数据。为什么选择HDF5呢?因为我需要存放大量的数据,而且速度也很重要。用关系型数据库管理系统(RDBMS)会在进行连接操作时遇到性能问题。所以,我需要一个既快又能有效利用内存的解决方案。

经过一些搜索,我发现Python和PyTables可能是个不错的选择。我的想法是先用Java解析XML数据,然后再写一个Python脚本,用PyTables API把数据插入到HDF5文件中,并从Java中执行这个Python脚本。也就是说,我会在Java程序里写并执行Python脚本。为了在Java中写Python脚本,我使用了java.io.*包,并用Process类来执行。比如:

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

我不太确定这个解决方案是否好。对我来说,从Java中写脚本用java.io.*感觉不太好。可能在后面读取脚本结果时会遇到问题(比如用Python脚本和PyTables API进行一些搜索时)。

所以,我有几个问题想请教一下。解析XML数据和存储到HDF5之间,哪个解决方案更好?我现在的做法(从Java代码中写和执行Python脚本)是否正确?Python和PyTables适合我的问题吗?我还看到一些关于Jython的资料,但不确定它能否和PyTables结合使用。

欢迎专业人士提供意见和建议。谢谢大家的帮助。

2 个回答

2

我曾经做过一个项目,处理了大约60,000个Python的cPickle文件,把里面的内容(大约31,000行和4列的矩阵)放进了不同的PyTables表里。这个方法效果很好,运行得也很顺利。

不过我同意sarnold的看法。我建议你要么继续用Java,要么用Python,选择你最熟悉、最舒服的那种。我觉得用Python和PyTables更容易得到结果,特别是在写导入脚本的时候。

顺便问一下,你为什么想从Java运行Python脚本呢?直接运行Python脚本不就行了吗?

另外,还有一个Python的h5py包,它比PyTables更底层。PyTables其实是在HDF5的基础上增加了一个额外的抽象层。例如,PyTables有表的概念,这和关系数据库中的表类似,并且支持索引(而HDF5本身不支持这些功能)。

理论上,你可以从Java读取用PyTables创建的HDF5文件。但是,你不能直接使用PyTables的所有功能,比如表和索引。此外,如果你在PyTables中使用了Blosc压缩算法,你可能根本无法在Java中加载它。

3

我觉得用Java写脚本时用到java.io.*并不好。

我也是这样想的——你已经把XML中的数据解析成Java内部的某种表示形式,然后又把这些数据写入一个Python脚本,接着Python解释器又要把这些数据重新解析成内部表示,最后才能写入HDF5文件。这就把Java的XML解析接口、XML数据格式和Python操作HDF5文件的API都绑在了一起,听起来涉及的东西比应该有的还要多。(你真的想为了更新一个重命名的Python包而去用javac吗?)

我觉得可以再退一步,看看这个问题的两个步骤:

  • 解析XML
  • 写入HDF5

在这两个步骤之间没有必要使用两种语言——我建议要么完全用Java,要么完全用Python。这样最终的结果会在更多系统上运行得更快,占用更少的内存,而且无论你选择哪种语言,维护起来也会更简单。

撰写回答