CSV转HDF5再转pandas dataframe为何内存占用远低于直接读CSV?
为什么CSV转HDF5再转Pandas DataFrame,内存占用比直接读CSV更低?
1. HDF5本身的压缩和存储优势
CSV是纯文本格式,不管数字还是字符串都用字符存储,冗余量极大。比如一个整数12345在CSV里要占5个字节,换成HDF5用原生int类型存储可能只需要4字节,再加上HDF5支持gzip、lzf这类压缩算法,能直接把文件体积压到极小——这就是33GB CSV能缩成1.4GB HDF5的核心原因。而且HDF5是二进制格式,读取时不需要像CSV那样做大量字符串转数值的解析操作,减少了中间内存开销。
2. Vaex的分块加载机制降低峰值内存
Vaex读取HDF5时,默认采用延迟加载+分块读取策略:它不会一次性把整个1.4GB的文件全塞进内存,只有当需要处理数据时,才会按需读取部分数据块。当你把Vaex DataFrame转成Pandas DataFrame时,Vaex也是分批将数据传入Pandas,而非一次性加载全部数据,自然不会造成瞬间的高内存负载。
3. Pandas直接读CSV的内存浪费问题
Pandas读CSV默认是一次性将整个文件加载到内存中。33GB的CSV,就算经过Pandas的类型推断优化,实际占用的内存通常会远大于文件本身——毕竟要处理字符串转数值的中间操作,再加上DataFrame自身的结构开销,很容易把内存占满。而且CSV的类型推断需要扫描大量数据,过程中也会占用额外内存;而HDF5存储时已经明确了数据类型,Vaex读取时直接沿用,无需重复推断,又省了一笔内存开销。
内容的提问来源于stack exchange,提问作者a.ydv
相关产品推荐
相关产品推荐

