熊猫HDF5作为数据库

prl*_*900 12 python database hdf5 pytables pandas

去年我一直在使用python pandas,我对它的性能和功能印象深刻,但是pandas还不是一个数据库.我最近一直在想如何将大熊猫的分析能力整合到一个平坦的HDF5文件数据库中.不幸的是,HDF5并不是为了本地处理并发而设计的.

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

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

任何有关可能的路径,现有类似项目或整个想法的便利/不便的想法将非常感激.

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

Ümi*_*mit 10

HDF5适用于并发只读访问.
对于并发写访问,您必须使用并行HDF5或具有处理写入HDF5存储的工作进程.

有一些努力将HDF5与来自HDF Group的RESTful API结合起来.有关详细信息,请参见此处此处.我不确定它有多成熟.

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

有一个公共REST API可以访问数据,用户不必关心窗帘后面发生了什么.
这也是我们用于存储生物信息的方法.


Pie*_*ton 7

我知道以下对这个问题不是一个好的答案,但它完全符合我的需求,我没有发现它在其他地方实现:

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)
Run Code Online (Sandbox Code Playgroud)

我用它作为

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
Run Code Online (Sandbox Code Playgroud)

并且在同一商店上工作的不同进程/线程将简单地排队.

请注意,如果您从多个流程中天真地操作商店,那么最后关闭商店将"赢",其他人"认为他们已经写过"将会丢失.

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

编辑:现在可以调整"probe_interval"(如果频繁写入,则一秒钟太多)


小智 5

HDF Group 现已推出适用于 HDF5 的 REST 服务:http ://hdfgroup.org/projects/hdfserver/