prl*_*900 12 python database hdf5 pytables pandas
去年我一直在使用python pandas,我对它的性能和功能印象深刻,但是pandas还不是一个数据库.我最近一直在想如何将大熊猫的分析能力整合到一个平坦的HDF5文件数据库中.不幸的是,HDF5并不是为了本地处理并发而设计的.
我一直在寻找锁定系统,分布式任务队列,并行HDF5,平面文件数据库管理器或多处理的灵感,但我仍然不知道从哪里开始.
最后,我希望有一个RESTful API来与HDF5文件进行交互,以创建,检索,更新和删除数据.一个可能的用例可能是构建一个时间序列存储,传感器可以在其中写入数据,并且可以在其上实现分析服务.
任何有关可能的路径,现有类似项目或整个想法的便利/不便的想法将非常感激.
PD:我知道我可以使用SQL/NoSQL数据库来存储数据,但我想使用HDF5,因为在检索大量数据时我没有看到任何更快的内容.
我知道以下对这个问题不是一个好的答案,但它完全符合我的需求,我没有发现它在其他地方实现:
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"(如果频繁写入,则一秒钟太多)
| 归档时间: |
|
| 查看次数: |
6484 次 |
| 最近记录: |