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()