在Python中使用h5py进行大数据分析的经验?
我做很多统计工作,主要使用Python作为编程语言。不过,我处理的一些数据集可能会占用20GB的内存,这让使用numpy、scipy和PyIMSL这些库的内存操作几乎变得不可能。统计分析语言SAS在这方面有很大优势,因为它可以直接从硬盘读取数据,而不是只能在内存中处理。但我不想写太多SAS的代码(出于各种原因),所以我想看看在Python中还有哪些选择(除了买更多的硬件和内存)。
我需要说明的是,像map-reduce这样的方式对我的工作帮助不大,因为我需要对完整的数据集进行操作(比如计算分位数或拟合逻辑回归模型)。
最近我开始尝试使用h5py,我觉得这是我找到的最好的选择,它可以让Python像SAS一样,从硬盘读取数据(通过hdf5文件),同时还能利用numpy、scipy、matplotlib等库。我想听听有没有人也在类似的环境下使用Python和h5py,得到了什么样的经验。有没有人能在以往被SAS主导的“大数据”环境中使用Python呢?
补充一下:买更多的硬件和内存确实能帮助,但从IT的角度来看,当组织需要分析巨大的数据集时,很难向他们推销Python,因为Python(或者R、MATLAB等)需要将数据保存在内存中。SAS在这方面仍然有很强的卖点,因为虽然基于硬盘的分析可能会慢一些,但你可以放心地处理巨大的数据集。所以,我希望Stackoverflow的朋友们能帮我想办法,降低使用Python作为主要大数据分析语言的风险感。
2 个回答
我不太用Python来做统计,通常处理的数据集也比较小。不过,花点时间看看R语言的CRAN任务视图,特别是关于高性能计算的部分,可能会有帮助,尤其是“内存大和超大内存数据”这一块。
有三个原因:
- 你可以查看那些包的源代码,获取一些灵感,可能对你有帮助。
- 你可能会发现那些包的名字在寻找Python对应的工具时很有用;很多使用R的人也会用Python。
- 在某些情况下,直接用R来做特定的分析,然后把结果带回Python中,可能会更方便。
再次强调,这些内容对我来说有点复杂,也许你已经知道这些了。但希望这些信息对你或者正在解决类似问题的人有用。
我们使用Python配合h5py、numpy/scipy和boost::python来进行数据分析。我们的数据集通常有几百GB那么大。
HDF5的优点:
- 可以方便地使用h5view应用程序、h5py/ipython和h5*命令行工具来查看数据。
- 有适用于不同平台和语言的接口。
- 可以通过分组来组织数据。
- 可以使用属性来给数据添加注释。
- 内置的数据压缩功能,让你不用担心数据占用太多空间。
- 对单个数据集的读写速度很快。
HDF5的缺点:
- 如果一个h5文件里有太多的数据集或分组(超过1000个),性能会下降,因为遍历这些数据会很慢。不过,对于少量的大数据集,读写速度还是很快的。
- 实现复杂的数据查询(像SQL那样)会比较麻烦,而且速度慢(在这种情况下可以考虑使用SQLite)。
- HDF5在某些情况下不是线程安全的:需要确保库是用正确的选项编译的。
- 修改h5数据集(比如调整大小、删除等)会导致文件大小膨胀(在最好的情况下),或者根本无法完成(在最坏的情况下,整个h5文件必须被复制才能重新整理)。