全部版块 我的主页
论坛 提问 悬赏 求职 新闻 读书 功能一区 悬赏大厅 求助成功区
1403 13
2024-05-14
悬赏 100 个论坛币 已解决
我在使用python的frds库计算LRMES时,运行出现了这个错误,希望大神可以帮忙解答

附件: 您需要登录才可以下载或查看附件。没有帐号?我要注册

最佳答案

charles836 查看完整内容

根据报错信息 concurrent.futures.process.BrokenProcessPool,这个错误通常表示在任务执行过程中,有一个子进程异常终止。常见原因包括: 内存问题:处理的数据量太大,导致内存不足,从而使子进程被操作系统强制终止。 子进程错误:子进程在执行过程中遇到错误,导致崩溃。 数据序列化问题:传递给子进程的数据量太大或包含无法序列化的对象。 为了解决这个问题,我们可以进行以下几步操作: 1. 增加错误处理 在 compu ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2024-5-14 15:06:12
根据报错信息 concurrent.futures.process.BrokenProcessPool,这个错误通常表示在任务执行过程中,有一个子进程异常终止。常见原因包括:

内存问题:处理的数据量太大,导致内存不足,从而使子进程被操作系统强制终止。
子进程错误:子进程在执行过程中遇到错误,导致崩溃。
数据序列化问题:传递给子进程的数据量太大或包含无法序列化的对象。
为了解决这个问题,我们可以进行以下几步操作:

1. 增加错误处理
在 compute_lrmes_for_date 函数中增加错误处理,并打印错误信息以便调试。

2. 确保数据索引为日期时间类型
确保传递给子进程的数据索引为 DatetimeIndex 类型,以避免数据格式问题。
3. 打印调试信息
添加调试信息,帮助定位问题所在。

修改后代码:
import numpy as np
import pandas as pd
from concurrent.futures import ProcessPoolExecutor
import traceback
from frds.measures import LRMES

def compute_lrmes_for_date(args):
    try:
        date, data = args
        if date.year < 2007:
            return None
        sub_data = data.loc[:date]
        lrmes = LRMES(sub_data["Rccb"], sub_data["Rhs300"]).estimate(h=22 * 6, C=-0.4)
        print((date, lrmes))
        return (date, lrmes)
    except Exception as e:
        print(f"Error processing date {date}: {e}")
        traceback.print_exc()
        return None

if __name__ == "__main__":
    # 加载数据
    data = pd.read_excel(r'C:\Users\Administrator\Desktop\test2.xlsx')

    # 确保索引为日期时间类型
    if not isinstance(data.index, pd.DatetimeIndex):
        data.index = pd.to_datetime(data.index)

    with ProcessPoolExecutor() as executor:
        lrmes_values = list(
            executor.map(
                compute_lrmes_for_date,
                [(d, data) for d in data.index.unique()],
            )
        )

    # 过滤掉None值
    lrmes_values = [x for x in lrmes_values if x is not None]
    lrmes_df = pd.DataFrame(lrmes_values, columns=["Date", "LRMES"]).set_index("Date")
   
    # 合并数据
    data = pd.merge_asof(data, lrmes_df, left_index=True, right_index=True, direction="backward")
   
    # 保存更新后的数据
    data.to_excel(r'C:\Users\Administrator\Desktop\output.xlsx')

进一步的调试步骤
运行脚本:执行修改后的脚本,查看输出的调试信息和错误日志。
监控资源使用:在执行脚本时,监控系统的内存和CPU使用情况,确保资源没有被耗尽。
分块处理数据:如果数据量很大,可以尝试分块处理,减少每个子进程处理的数据量。例如,将数据按年份或月份分块处理。
通过上述步骤,我们可以逐步定位和解决子进程异常终止的问题
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2024-5-15 08:36:29
原因是
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2024-5-16 14:06:56
起码把引发错误的语句简单写出来吧
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2024-5-16 21:30:57
代码和出错提示见图1和图2
附件: 您需要登录才可以下载或查看附件。没有帐号?我要注册
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2024-5-16 21:33:12
富小能 发表于 2024-5-16 14:06
起码把引发错误的语句简单写出来吧
代码如下:
from concurrent.futures import ProcessPoolExecutor
from frds.measures import LRMES
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def compute_lrmes_for_date(args):
    date, data = args
    if date.year < 2007:
        return None
    sub_data = data.loc[:date]
    lrmes = LRMES(sub_data["Rccb"], sub_data["Rhs300"]).estimate(h=22 * 6, C=-0.4)
    print((date, lrmes))
    return (date, lrmes)

if __name__ == "__main__":
    data=pd.read_excel(r'C:\Users\Administrator\Desktop\test2.xlsx')
    with ProcessPoolExecutor() as executor:
        lrmes_values = list(
            executor.map(
                compute_lrmes_for_date,
                [(d, data) for d in data.index.unique()],
                )
            )
    lrmes_values = [x for x in lrmes_values if x is not None]
    lrmes_df = pd.DataFrame(lrmes_values, columns=["Date", "LRMES"]).set_index("Date")
    data = pd.merge_asof(data, lrmes_df, left_index=True, right_index=True, direction="backward")
运行错误提示如下:
Traceback (most recent call last):
  File "<pyshell#26>", line 4, in <module>
    lrmes_values = list(
  File "C:\Program Files\Python311\Lib\concurrent\futures\process.py", line 620, in _chain_from_iterable_of_lists
    for element in iterable:
  File "C:\Program Files\Python311\Lib\concurrent\futures\_base.py", line 619, in result_iterator
    yield _result_or_cancel(fs.pop())
  File "C:\Program Files\Python311\Lib\concurrent\futures\_base.py", line 317, in _result_or_cancel
    return fut.result(timeout)
  File "C:\Program Files\Python311\Lib\concurrent\futures\_base.py", line 456, in result
    return self.__get_result()
  File "C:\Program Files\Python311\Lib\concurrent\futures\_base.py", line 401, in __get_result
    raise self._exception
concurrent.futures.process.BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群