如何在Vaex中无需转pandas数据帧直接读取SAS格式数据文件?
30GB SAS文件低内存加载适配Vaex的可行方案
现有Vaex官方给出的SAS转存方案需要全量加载文件到pandas,30GB文件远超过普通内存上限,以下两个方案可避开全量加载的问题,全程低内存完成转换和加载:
方案1:基于pandas分块读取转HDF5(无需额外依赖)
利用pandas read_sas 原生支持的分块迭代能力,每次仅读取部分数据写入HDF5格式文件,HDF5为Vaex原生支持的格式,转换完成后可直接加载使用。
import pandas as pd import vaex # 配置参数 sas_file_path = "./data/io/sample_airline.sas7bdat" hdf5_output_path = "./data/airline.h5" chunksize = 100000 # 可根据可用内存调整,内存充足可设为50万-100万 # 分块读取SAS并写入HDF5 with pd.HDFStore(hdf5_output_path, mode='w') as store: # 迭代读取SAS分块,encoding根据文件实际编码调整 for chunk in pd.read_sas(sas_file_path, chunksize=chunksize, encoding='gbk'): # 追加写入HDF5,data_columns参数可提升后续Vaex查询性能 store.append('airline_data', chunk, data_columns=True, index=False) # 直接加载HDF5文件,全程无全量内存占用 df = vaex.open(hdf5_output_path)
方案2:基于pyreadstat分块读取(性能更优)
pyreadstat是专门用于读取SAS、SPSS等统计软件格式文件的第三方库,读取性能和内存控制均优于pandas原生的read_sas,适合超大体积SAS文件处理。
首先安装依赖:pip install pyreadstat
对应代码:
import pyreadstat import pandas as pd import vaex sas_file_path = "./data/io/sample_airline.sas7bdat" hdf5_output_path = "./data/airline.h5" chunksize = 100000 # 初始化分块读取器 reader = pyreadstat.read_file_in_chunks(pyreadstat.read_sas7bdat, sas_file_path, chunksize=chunksize) with pd.HDFStore(hdf5_output_path, mode='w') as store: for chunk, meta in reader: store.append('airline_data', chunk, data_columns=True, index=False) df = vaex.open(hdf5_output_path)
关键注意事项
- 编码适配:如果读取时出现乱码或解码错误,可尝试更换
encoding参数为latin-1、utf-8等适配你的文件编码 - 块大小调整:如果可用内存大于16G,可将
chunksize调整为500000到1000000,减少IO次数提升转换效率 - 类型统一:如果SAS文件中同列存在不同类型的数值,可在分块读取时统一强制转换类型,避免HDF5追加时类型不兼容报错
内容的提问来源于stack exchange,提问作者Ze C.
相关产品推荐
相关产品推荐

