Pandas HDF5作为数据库
我过去一年一直在使用Python的pandas库,对它的性能和功能感到非常惊讶。不过,pandas并不是一个数据库。我最近在考虑如何将pandas的分析能力与一个简单的HDF5文件数据库结合起来。可惜的是,HDF5并不是为了处理并发操作而设计的。
我一直在寻找灵感,比如锁定系统、分布式任务队列、并行HDF5、平面文件数据库管理器或多进程等,但我仍然没有一个清晰的方向来开始。
最终,我希望能有一个RESTful API来与HDF5文件互动,以便创建、获取、更新和删除数据。一个可能的应用场景是建立一个时间序列存储,让传感器可以写入数据,并在其上实现分析服务。
如果有人能提供一些可能的方向、现有的类似项目,或者对这个想法的优缺点的看法,我将非常感激。
附注:我知道我可以使用SQL或NoSQL数据库来存储数据,但我想用HDF5,因为在获取大量数据时,我还没见过比它更快的。
3 个回答
5
HDF Group现在推出了一个用于HDF5的REST服务,你可以在这里找到更多信息:http://hdfgroup.org/projects/hdfserver/
9
我知道下面这个回答可能不是很符合问题的要求,但对我来说正好合适,而且我没有找到其他地方有类似的实现:
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”(如果写入频繁,一秒钟的时间太长了)