如何利用Dask多核优势单独绘制各分区的变量-时间曲线?
解决方案:用Dask并行提取数据后统一绘图
核心思路
利用Dask的map_partitions并行处理每个Parquet文件(对应一个分区)的数据提取,把耗时的IO和数据预处理放在多核集群完成,最后用提取好的小数据集统一绘制500条曲线,兼顾效率和效果。
步骤实现
1. 确认分区与读取数据
首先确保每个Parquet文件对应Dask DataFrame的一个分区(read_parquet默认会按文件划分分区):
import dask.dataframe as dd # 读取Parquet文件,默认一个文件对应一个分区 df = dd.read_parquet("path/to/parquet/files/*.parquet") print(df.npartitions) # 应该输出500
2. 并行提取分区数据
定义函数提取每个分区的时间与变量数据,通过map_partitions并行执行:
def extract_curve_data(partition_df): # 假设时间列名为'timestamp',目标变量列名为'variable' time_values = partition_df['timestamp'].values var_values = partition_df['variable'].values return (time_values, var_values) # 并行提取所有分区的数据,返回结果列表 curve_data_list = df.map_partitions(extract_curve_data).compute()
3. 统一绘制所有曲线
遍历提取好的数据集,一次性绘制500条曲线:
import matplotlib.pyplot as plt fig, ax = plt.subplots(figsize=(14, 8)) for time_data, var_data in curve_data_list: ax.plot(time_data, var_data, linewidth=0.8) # 调整线宽避免重叠 ax.set_xlabel('时间') ax.set_ylabel('变量值') ax.set_title('500条变量随时间变化曲线') plt.tight_layout() plt.show()
为什么这种方式高效?
map_partitions利用Dask多核能力并行处理500个分区的数据提取,把最耗时的IO和数据加载操作分散到多个核心完成,比串行遍历分区快得多。- 最后绘图阶段仅处理提取后的小批量数组,绘图本身的耗时占比极低,不会成为性能瓶颈。
注意事项
- 如果你的Parquet文件不是一个对应一个分区,可通过
df = df.repartition(npartitions=500)强制划分,但优先保证读取时的分区合理性以避免额外开销。 - 若每个Parquet包含多个变量列,可修改
extract_curve_data函数,返回多组(时间,变量)数据,再在绘图阶段循环绘制。 - 批量绘图时建议设置matplotlib非交互式后端(
plt.switch_backend('Agg')),避免多线程绘图的冲突问题。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

