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

如何在送入多进程函数前按需拆分数据?优化内存与平滑衔接

多进程LOESS平滑的内存优化问题

平滑与未平滑数据示例图

当前实现代码

import os
import pandas as pd
from multiprocessing import Pool

def smooth_data_mp(data_frame, n):  # dataframe是输入数据,n为平滑时参考的数据点数量
    num_processes = os.cpu_count() + 2
    chunk_size = len(data_frame.index) // num_processes
    print(chunk_size)
    end_chunk = len(data_frame) // chunk_size - 1  # 索引从0开始所以要减1,这行代码调了一小时我真服了
    with Pool(processes=num_processes) as pool:
        results = pool.starmap(process_data, [(data_frame, i, chunk_size, n, end_chunk) for i in
                                    range(len(data_frame) // chunk_size)])
    return pd.concat(results)


def process_data(dataframe, i, chunk_size, n, end_chunk):
    fraction = n / chunk_size  # 平滑函数中参考的数据点占块大小的比例
    if i == 0:
        start_frame = 0
    else:
        start_frame = chunk_size * i - n
    if i == end_chunk:
        end_frame = len(dataframe)  # 确保end_frame不超过sampleData的长度
    else:
        end_frame = chunk_size * (i + 1) + n
    new_data_frame = calculate_loess_on_subset(dataframe[start_frame:end_frame], fraction, i, n, end_chunk)

    start_index = chunk_size * i
    if i == end_chunk:
        end_index = len(dataframe)
    else:
        end_index = chunk_size * (i + 1)
    new_data_frame.index = pd.RangeIndex(start_index, end_index)
    return new_data_frame

问题描述

我希望在将数据送入每个进程前,在process_data函数内按需拆分数据。当前使用更多进程处理大型DataFrame时,因内存开销过大出现了扩展性问题。

我为数据块添加填充数据的原因是执行平滑函数时,若不为中间数据块前后各添加n个数据点(首尾块无需此操作),LOESS平滑会因未考虑数据块外的前置点,导致平滑结果出现衔接断层。

内容的提问来源于stack exchange,提问作者AceKijani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 16:04:57