请选择 进入手机版 | 继续访问电脑版
楼主: 150816050
480 11

[统计软件与数据分析] 求大神解答python运行出现这个错误的解决方法 [推广有奖]

  • 0关注
  • 0粉丝

博士生

2%

还不是VIP/贵宾

-

威望
0
论坛币
810 个
通用积分
0.0889
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
16604 点
帖子
78
精华
0
在线时间
172 小时
注册时间
2022-10-17
最后登录
2024-5-28

150816050 发表于 2024-5-14 15:06:11 |显示全部楼层 |坛友微信交流群
100论坛币
我在使用python的frds库计算LRMES时,运行出现了这个错误,希望大神可以帮忙解答
微信截图_20240514094821.png

关键词:python 解决方法 RDS mes frd
Killua609 发表于 2024-5-15 08:36:29 |显示全部楼层 |坛友微信交流群
原因是

使用道具

富小能 发表于 2024-5-16 14:06:56 |显示全部楼层 |坛友微信交流群
起码把引发错误的语句简单写出来吧

使用道具

150816050 发表于 2024-5-16 21:30:57 |显示全部楼层 |坛友微信交流群
代码和出错提示见图1和图2

出错提示

出错提示

代码

代码

使用道具

150816050 发表于 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.

使用道具

150816050 发表于 2024-5-16 21:40:08 |显示全部楼层 |坛友微信交流群
测试数据如下

test2.xlsx

140.24 KB

测试数据

使用道具

150816050 发表于 2024-5-16 21:51:04 |显示全部楼层 |坛友微信交流群
Killua609 发表于 2024-5-15 08:36
原因是
原因我也在找,代码、错误提示和测试数据放在下面回复里了

使用道具

zelda0079 发表于 2024-5-19 11:54:29 |显示全部楼层 |坛友微信交流群
看起来你在尝试运行一段Python代码时遇到了问题。这段代码看起来是要对一个数据集进行LRMES估计,并且试图使用多进程来加速计算。
从你提供的错误讯息来看,错误是由於"BrokenProcessPool"而导致的,这通常意味着一个进程在未完成的情况下突然被终止。这可能是由多种原因引起的,例如记忆体不足,或者是进程中有未捕获的异常导致该进程崩溃。
解决这个问题可能需要对你的代码进行一些调整,以下是一些可能的解决方案:
检查你的数据:确保你要处理的数据中没有异常值或者能引起错误的值。
增加错误处理:在你的compute_lrmes_for_date函数中加入try/except语句,捕获并处理可能产生的异常。
减少同时运行的进程数:可能你的系统无法同时处理大量的进程,尝试降低ProcessPoolExecutor()中的进程数量。
检查记忆体:如果你的系统记忆体不足,可能会导致进程无法完成运行。你可以尝试关闭一些不需要的应用程序来释放记忆体,或者考虑增加系统的记忆体。
希望以上的建议对你有所帮助,如果你还有其他问题,请随时告诉我。

使用道具

zelda0079 发表于 2024-5-19 11:57:37 |显示全部楼层 |坛友微信交流群
处理多进程时遇到BrokenProcessPool 异常,通常是因为某个进程在执行过程中意外终止了。这可能由于以下几个原因造成的:
异常处理不足:如果在进程中有未被捕捉的异常抛出,可能导致进程崩溃。检查是否有可能抛出异常的代码部分,使用 try-except 块来捕获并处理。
内存不足:多进程可能会消耗大量内存,如果系统内存不足,可能导致进程意外终止。监控内存使用情况,适当优化代码,或考虑增加硬件内存。
进程池大小:ProcessPoolExecutor 默认的进程数是你的计算机的处理器核心数。如果你的硬件资源有限,尝试减小进程池的大小。
代码兼容性:你使用的库或环境可能和当前的Python版本存在不兼容的情况,检查代码、库和环境是否最新且相互兼容。
密集型计算或I/O阻塞:如果你的函数执行了大量计算或I/O操作,没有足够的资源可用,进程可能会被系统终止。
代码调试:逐步执行你的代码,确定是在执行哪一部分时出现了 BrokenProcessPool 异常,这可以帮助定位问题。
进行以上检查后,如果问题依然存在,可能需要更加详细地了解你的代码和环境配置。此外,确保LRMES函数本身和所使用的数据是正确的和可以处理的。如果此异常是随机发生的,那可能与系统的复杂性有关,这种情况下重试或对系统资源进行监控可能会有所帮助。

使用道具

charles836 发表于 2024-5-19 22:15:48 |显示全部楼层 |坛友微信交流群
根据报错信息 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使用情况,确保资源没有被耗尽。
分块处理数据:如果数据量很大,可以尝试分块处理,减少每个子进程处理的数据量。例如,将数据按年份或月份分块处理。
通过上述步骤,我们可以逐步定位和解决子进程异常终止的问题

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-28 09:59