Pandas HDF5作为数据库

15 投票
3 回答
10708 浏览
提问于 2025-04-17 23:04

我过去一年一直在使用Python的pandas库,对它的性能和功能感到非常惊讶。不过,pandas并不是一个数据库。我最近在考虑如何将pandas的分析能力与一个简单的HDF5文件数据库结合起来。可惜的是,HDF5并不是为了处理并发操作而设计的。

我一直在寻找灵感,比如锁定系统、分布式任务队列、并行HDF5、平面文件数据库管理器或多进程等,但我仍然没有一个清晰的方向来开始。

最终,我希望能有一个RESTful API来与HDF5文件互动,以便创建、获取、更新和删除数据。一个可能的应用场景是建立一个时间序列存储,让传感器可以写入数据,并在其上实现分析服务。

如果有人能提供一些可能的方向、现有的类似项目,或者对这个想法的优缺点的看法,我将非常感激。

附注:我知道我可以使用SQL或NoSQL数据库来存储数据,但我想用HDF5,因为在获取大量数据时,我还没见过比它更快的。

3 个回答

5

HDF Group现在推出了一个用于HDF5的REST服务,你可以在这里找到更多信息:http://hdfgroup.org/projects/hdfserver/

9

我知道下面这个回答可能不是很符合问题的要求,但对我来说正好合适,而且我没有找到其他地方有类似的实现:

from pandas import HDFStore
import os
import time

class SafeHDFStore(HDFStore):
    def __init__(self, *args, **kwargs):
        probe_interval = kwargs.pop("probe_interval", 1)
        self._lock = "%s.lock" % args[0]
        while True:
            try:
                self._flock = os.open(self._lock, os.O_CREAT |
                                                  os.O_EXCL |
                                                  os.O_WRONLY)
                break
            except FileExistsError:
                time.sleep(probe_interval)

        HDFStore.__init__(self, *args, **kwargs)

    def __exit__(self, *args, **kwargs):
        HDFStore.__exit__(self, *args, **kwargs)
        os.close(self._flock)
        os.remove(self._lock)

我这样使用它:

result = do_long_operations()
with SafeHDFStore('example.hdf') as store:
    # Only put inside this block the code which operates on the store
    store['result'] = result

而且不同的进程或线程在同一个存储上工作时,会自动排队。

要注意,如果你不小心让多个进程同时操作这个存储,最后一个关闭存储的进程会“胜出”,而其他进程“认为自己已经写入的内容”就会丢失。

(我知道我可以让一个进程来管理所有的写入,但这样做会避免一些额外的开销)

编辑:现在可以调整“probe_interval”(如果写入频繁,一秒钟的时间太长了)

14

HDF5在同时读取数据时表现得很好。
但如果是同时写入数据,你要么得使用并行HDF5,要么就需要一个专门的工作进程来负责写入HDF5存储。

HDF集团正在努力将HDF5和RESTful API结合起来。想了解更多,可以查看这里这里。不过我不太确定这个项目现在发展得怎么样。

我建议使用一种混合的方法,通过RESTful API来提供服务。
你可以把一些元信息存储在SQL或NoSQL数据库中,而把原始数据(比如时间序列数据)保存在一个或多个HDF5文件里。

这样就有一个公共的REST API可以访问数据,用户不需要关心背后发生了什么。
这也是我们存储生物信息时采用的方法。

撰写回答