去年我一直在使用蟒蛇熊猫,它的性能和功能给我留下了深刻的印象,但是熊猫还不是一个数据库。最近我一直在考虑如何将熊猫的分析功能集成到一个平面的HDF5文件数据库中。不幸的是,HDF5不是为处理并发性而设计的。
我一直在寻找锁定系统、分布式任务队列、并行HDF5、平面文件数据库管理器或多处理的灵感,但我仍然不清楚从哪里开始。
最终,我希望有一个RESTful API来与HDF5文件交互,以创建、检索、更新和删除数据。这方面的一个可能的用例是建立一个时间序列存储,传感器可以在其中写入数据,并在上面实现分析服务。
任何关于可能遵循的途径、现有的类似项目或整个想法的方便/不便的想法都将不胜感激。
PD:我知道我可以使用一个SQL/NoSQL数据库来存储数据,但是我想使用HDF5,因为在检索大量数据时,我没有看到任何更快的东西。
发布于 2014-03-20 11:58:42
HDF5适用于并发只读访问。
对于并发写访问,您要么必须使用parallel HDF5,要么有一个工作进程负责编写HDF5存储。
有一些努力将HDF5与的RESTful API结合起来。有关更多细节,请参见here和here。我不知道它有多成熟。
我建议使用混合方法,并通过RESTful API公开它。
您可以将元信息存储在SQL/NoSQL数据库中,并将原始数据(时间序列数据)保存在一个或多个HDF5文件中。
有一个公共REST来访问数据,用户不必关心窗帘后面发生了什么。
这也是我们存储生物信息的方法。
发布于 2015-03-12 15:48:41
我知道下面这个问题不是一个很好的答案,但它非常适合我的需要,而且我发现它没有在其他地方实现:
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“现在可以调优(如果频繁写入,那么一秒就太多了)
发布于 2015-03-02 15:16:19
HDF现在为HDF5提供REST服务:http://hdfgroup.org/projects/hdfserver/
https://stackoverflow.com/questions/22522551
复制相似问题