You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:05:49