Python系列之入门篇——HDF5
简介
HDF5(层次性数据格式)作用于大数据存储,其高效的压缩方式节约了不少硬盘空间,同时也给查询效率带来了一定的影响,压缩效率越高,查询效率越低。pandas v0.20.2(含)之后的版本默认选用blosc压缩,跟bzip2相比,其间做了一个小测试,10000条数据,bzip2的压缩率是blosc的30倍,而查询效率blosc却是bzip2的8倍。至于项目中选用哪种压缩方式,需要看具体需求。
回顾上一节《Python系列之入门篇——Pandas》
上一节提到用hdf5作为大数据存储,有很多细节值得注意的,其中包括表的设计、索引的设计、压缩方式的选择、多进程操作文件的处理方式等等。这一节根据自己项目中遇到的问题来分享下最后一点,也就是多进程操作文件,如何来保证文件的一致性。
文件锁(fcntl)
我们可以利用文件锁来保证每时每刻有且只有一个进程可以操作同一个文件,从而避免进程间的相互竞争导致意想不到的结果,甚至会破坏整个hdf5文件,导致数据不可查的严重后果。
引入相关模块
import fcntl
创建文件锁
""" Add LOCK_EX(排它锁) to test.txt depend on fileno """ f = open('test.txt') fileno = f.fileno() fcntl.flock(fileno, fcntl.LOCK_EX)
此时如果有另一个进程同时操作test.txt,将会被阻塞,直到上一个拥有该文件锁的进程退出。
释放文件锁
""" Release lock on test.txt """ fcntl.flock(f.fileno(), fcntl.LOCK_UN) f.close()