使用cudf高效加载Pickle文件:寻求更内存友好的方案
内存高效加载Pickle文件到cuDF DataFrame的方案
当前先加载到pandas再转cuDF的方式会占用大量CPU内存(pandas需要把整个文件加载到CPU内存中),对于大文件来说内存压力很大,以下是几个更高效的解决方案:
1. 直接使用cuDF的原生Pickle读取方法(推荐,若版本支持)
从cuDF 22.06版本开始,已经支持直接读取Pickle文件,无需经过pandas。可以直接调用cudf.read_pickle()方法:
import cudf # 直接加载Pickle文件到cuDF DataFrame cudf_dataframe = cudf.read_pickle('Large_File.pkl')
注意:如果你的cuDF版本较低,需要先升级到支持该功能的版本。这个方法完全跳过CPU内存的中间存储,内存效率最高。
2. 用Dask分块加载并转换
如果文件过大,单进程无法一次性加载到内存,可以用Dask分块读取Pickle,再逐块转换为cuDF格式,避免一次性占用过多CPU内存:
import dask.dataframe as dd import cudf # 分块读取Pickle文件 dask_df = dd.read_pickle('Large_File.pkl') # 将每个Dask分区转换为cuDF DataFrame dask_cudf_df = dask_df.map_partitions(cudf.DataFrame.from_pandas) # 按需计算或转换为完整cuDF DataFrame(若GPU内存足够) cudf_dataframe = dask_cudf_df.compute()
这种方式通过分块处理,把CPU内存占用控制在单块数据的大小,适合超大型文件。
3. 转换为GPU友好的列式存储格式(长期优化)
Pickle是面向CPU的序列化格式,对GPU读取不友好。可以一次性将Pickle文件转换为Parquet或ORC格式(列式存储,cuDF原生支持高效读取),后续直接用cuDF读取:
转换步骤(仅需执行一次)
import pandas as pd import cudf # 一次性加载并转换为Parquet pd_df = pd.read_pickle('Large_File.pkl') cudf_df = cudf.DataFrame.from_pandas(pd_df) cudf_df.to_parquet('Large_File.parquet')
后续直接读取
import cudf # 直接从Parquet加载到cuDF,内存效率极高 cudf_dataframe = cudf.read_parquet('Large_File.parquet')
Parquet格式支持压缩、列裁剪、分区等优化,后续加载速度和内存占用都会远优于Pickle。
内容的提问来源于stack exchange,提问作者C18
相关产品推荐
相关产品推荐

