Pandas HDF5 作为数据库
Posted
技术标签:
【中文标题】Pandas HDF5 作为数据库【英文标题】:Pandas HDF5 as a Database 【发布时间】:2014-04-26 16:23:38 【问题描述】:去年我一直在使用 python pandas,它的性能和功能给我留下了深刻的印象,但是 pandas 还不是数据库。我最近一直在思考如何将 pandas 的分析能力集成到一个平面 HDF5 文件数据库中。不幸的是,HDF5 并非设计为原生处理并发。
我一直在寻找有关锁定系统、分布式任务队列、并行 HDF5、平面文件数据库管理器或多处理的灵感,但我仍然不知道从哪里开始。
最终,我希望有一个 RESTful API 来与 HDF5 文件交互以创建、检索、更新和删除数据。一个可能的用例是构建一个时间序列存储,传感器可以在其中写入数据,分析服务可以在其上实现。
非常感谢您对可能的路径、现有的类似项目或整个想法的便利/不便的任何想法。
PD:我知道我可以使用 SQL/NoSQL 数据库来存储数据,但我想使用 HDF5,因为在检索大量数据时我没有看到任何更快的方法。
【问题讨论】:
【参考方案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 相结合。有关详细信息,请参阅 here 和 here。我不确定它有多成熟。
我建议使用混合方法并通过 RESTful API 公开它。 您可以将元信息存储在 SQL/NoSQL 数据库中,并将原始数据(时间序列数据)保存在一个或多个 HDF5 文件中。
有一个公共 REST API 可以访问数据,用户不必关心幕后发生的事情。 这也是我们用于存储生物信息的方法。
【讨论】:
感谢 Ümit,很高兴知道整个想法是有道理的,而且还有其他人也在朝同一个方向努力。最好了解在 python 中使用并行 HDF5 的项目。 "HDF5 适用于并发只读访问。"不是熊猫 read_hdf。以上是关于Pandas HDF5 作为数据库的主要内容,如果未能解决你的问题,请参考以下文章
如何在 hdf5 中有效地保存 python pandas 数据帧并将其作为 R 中的数据帧打开?