PandasHDF5作为数据库

2024-05-11 17:41:00 发布

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

去年我一直在使用python pandas,它的性能和功能给我留下了深刻的印象,但是pandas还不是一个数据库。我最近一直在考虑如何将pandas的分析能力集成到一个平面HDF5文件数据库中。不幸的是,HDF5并不是为处理并发而设计的。

我一直在寻找锁系统、分布式任务队列、并行HDF5、平面文件数据库管理器或多处理的灵感,但我仍然不清楚从哪里开始。

最后,我希望有一个RESTful API来与HDF5文件交互以创建、检索、更新和删除数据。一个可能的用例是建立一个时间序列存储,传感器可以在其中写入数据,分析服务可以在上面实现。

任何关于可能遵循的道路、现有类似项目或整个想法的便利/不便的想法将非常感谢。

PD:我知道我可以使用SQL/NoSQL数据库来存储数据,但我想使用HDF5,因为在检索大量数据时,我没有看到任何更快的方法。


Tags: 文件数据功能restful数据库pandas管理器队列
3条回答

我知道下面的问题不是一个很好的答案,但它非常适合我的需要,而且我没有在其他地方实现它:

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

在同一个存储上工作的不同进程/线程将简单地排队。

请注意,如果您天真地从多个进程操作存储,则最后一次关闭存储将“获胜”,而其他人“认为他们所写的”将丢失。

(我知道我可以让一个进程管理所有的写操作,但是这个解决方案避免了酸洗的开销)

编辑:现在可以调整“探测间隔”(如果频繁写入,则一秒钟太长)

HDF组现在有一个HDF5的REST服务:http://hdfgroup.org/projects/hdfserver/

HDF5对于并发只读访问很好。
对于并发写访问,您要么使用parallel HDF5,要么使用负责向HDF5存储写入的工作进程。

有人试图将HDF5与HDF组intself中的RESTful API结合起来。有关详细信息,请参见herehere。我不知道它有多成熟。

我建议使用混合方法,并通过RESTful API公开它。
您可以将元信息存储在SQL/NoSQL数据库中,并将原始数据(时间序列数据)保存在一个或多个HDF5文件中。

有一个公共REST API来访问数据,用户不必关心幕后发生了什么。
这也是我们储存生物信息的方法。

相关问题 更多 >