【问题标题】:Pandas HDF5 as a DatabasePandas HDF5 作为数据库
【发布时间】:2014-04-26 16:23:38
【问题描述】:

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

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

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

非常感谢您对可能的路径、现有的类似项目或整个想法的便利/不便的任何想法。

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

【问题讨论】:

    标签: python database pandas hdf5 pytables


    【解决方案1】:

    我知道以下不是问题的好答案,但它非常适合我的需求,我没有发现它在其他地方实现:

    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”(如果频繁写入,一秒钟就太多了)

    【讨论】:

    • 我喜欢这个解决方案,但它会序列化写入。我想知道是否有类似于 cassandra 样式集群复制的管理 HDF5 集群的方法,其中每个节点复制其他节点的新/更新数据。
    • 诚实的答案是“不知道”......但即使假设有某种智能且相当有效的复制机制,我怀疑它对熊猫目的有用 - 或者更好:任何冲突解决程序应该知道 pandas 如何存储数据。
    • 不是集群,但可以使用 MPI 同时访问/修改 HDF5。见here。您可以想象跨网络使用它。
    • 我知道这一点......但我希望冲突解决对于并发访问(至少以与文件系统具有并发访问相同的“愚蠢”方式)比复制要简单得多。
    • @DennisGolomazov 很高兴知道这一点!
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      HDF5 适用于并发只读访问。
      对于并发写入访问,您要么必须使用parallel HDF5,要么拥有一个负责写入 HDF5 存储的工作进程。

      有一些努力将 HDF5 与 HDF Group 自身的 RESTful API 相结合。有关详细信息,请参阅 herehere。我不确定它有多成熟。

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

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

      【讨论】:

      • 感谢 Ümit,很高兴知道整个想法是有道理的,而且还有其他人也在朝同一个方向努力。最好了解在 python 中使用并行 HDF5 的项目。
      • "HDF5 适用于并发只读访问。"不是熊猫 read_hdf。
      猜你喜欢
      • 2013-10-14
      • 2017-02-23
      • 2016-10-27
      • 2018-04-20
      • 2018-12-02
      • 2017-03-13
      • 2016-09-29
      • 2018-08-25
      • 2017-01-11
      相关资源
      最近更新 更多