如何在送入多进程函数前按需拆分数据?优化内存与平滑衔接
多进程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
相关产品推荐
相关产品推荐

