【Python百宝箱】优化Python开发体验:日志记录、错误监控与高级调试

本文主要是介绍【Python百宝箱】优化Python开发体验:日志记录、错误监控与高级调试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

标题:“Python开发者的调试与性能优化大全”

前言

在软件开发的旅程中,调试和性能优化是每位开发者都需要掌握的关键技能。Python提供了丰富的工具和库,以应对开发中的各种挑战。本文将深入探讨logginglogurusentrypdbpy-spydebugpy等库,为Python开发者提供全面的调试、日志记录和性能优化指南。

【Python百宝箱】代码之外的艺术:精通命令行参数和日志记录在Python中的妙用

欢迎订阅专栏:Python库百宝箱:解锁编程的神奇世界

文章目录

      • 标题:**"Python开发者的调试与性能优化大全"**
      • 前言
      • 1. logging库
        • 1.1 日志记录的基础知识
        • 1.2 配置和日志级别
        • 1.3 高级日志记录技巧
        • 1.4 使用字典配置Logging
        • 1.5 使用Filter进行更复杂的日志过滤
        • 1.6 使用QueueHandler进行异步日志处理
      • 2. loguru库
        • 2.1 Loguru简介
        • 2.2 简化的日志记录语法
        • 2.3 自定义格式和输出目标
        • 2.4 基于日志记录的条件触发
        • 2.5 动态修改日志记录格式
        • 2.6 将日志输出到多个目标
      • 3. sentry库
        • 3.1 Sentry概述
        • 3.2 整合Sentry进行错误监控
        • 3.3 错误追踪和报告
        • 3.4 自定义Sentry事件处理
        • 3.5 Sentry上下文信息
        • 3.6 Sentry事件的重试和忽略
        • 3.7 Sentry环境集成
      • 4. pdb库
        • 4.1 使用Python调试器(pdb)
        • 4.2 设置断点和追踪执行
        • 4.3 调试技巧和命令
        • 4.4 条件断点
        • 4.5 运行时修改变量值
        • 4.6 单步执行和查看变量值
        • 4.7 脚本中插入多个断点
      • 5. py-spy库
        • 5.1 使用py-spy进行性能分析
        • 5.2 CPU性能分析
        • 5.3 分析运行中的Python程序
        • 5.4 采样间隔和持续监测
        • 5.5 使用py-spy记录性能数据
        • 5.6 绘制火焰图
      • 6. debugpy库
        • 6.1 debugpy简介
        • 6.2 远程调试和代码跟踪
        • 6.3 高级调试功能
          • 6.3.1 条件断点
          • 6.3.2 变量查看
          • 6.3.3 代码跟踪
          • 6.3.4 中断运行中的程序
          • 6.3.5 远程调试
          • 6.3.6 异步代码调试
          • 6.3.7 多进程调试
      • 总结

1. logging库

1.1 日志记录的基础知识

日志在软件开发中扮演着重要的角色,用于记录程序运行时的关键信息,方便调试和错误排查。Python内置的logging库提供了强大而灵活的日志记录工具。

import logging# 获取Logger对象
logger = logging.getLogger(__name__)# 不同级别的日志记录
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")
1.2 配置和日志级别

logging库允许我们配置日志记录的格式、输出位置等信息,同时设置日志的级别,只记录达到指定级别的信息。

import logging# 配置日志
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')# 获取Logger对象
logger = logging.getLogger(__name__)# 不同级别的日志记录
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")
1.3 高级日志记录技巧
import logging# 配置日志,输出到文件
logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')# 获取Logger对象
logger = logging.getLogger(__name__)# 添加日志文件回滚
from   logging.handlers import RotatingFileHandlerhandler = RotatingFileHandler('app.log', maxBytes=100000, backupCount=5)
logger.addHandler(handler)# 添加自定义过滤器
class CustomFilter(logging.Filter):def filter(self, record):return record.levelno == logging.WARNINGlogger.addFilter(CustomFilter())# 不同级别的日志记录
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")
1.4 使用字典配置Logging

除了之前介绍的基本配置方式外,logging库还支持使用字典进行配置,使配置更加灵活。这种方式允许将配置存储在一个字典中,然后传递给dictConfig方法进行配置。

import logging
from logging.config import dictConfig# 配置日志,使用字典配置
log_config = {'version': 1,'handlers': {'console': {'class': 'logging.StreamHandler','level': 'DEBUG','formatter': 'standard'},'file': {'class': 'logging.FileHandler','filename': 'app.log','level': 'DEBUG','formatter': 'detailed','mode': 'w'}},'formatters': {'standard': {'format': '%(asctime)s - %(levelname)s - %(message)s'},'detailed': {'format': '%(asctime)s - %(levelname)s - %(module)s - %(message)s'}},'root': {'level': 'DEBUG','handlers': ['console', 'file']}
}# 应用配置
dictConfig(log_config)# 获取Logger对象
logger = logging.getLogger(__name__)# 不同级别的日志记录
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")
1.5 使用Filter进行更复杂的日志过滤

Filterlogging库中强大的工具之一,通过自定义Filter类,可以实现更灵活、更复杂的日志过滤。下面的例子展示了如何使用自定义的Filter类来过滤出包含特定关键字的日志记录。

import logging# 获取Logger对象
logger = logging.getLogger(__name__)# 添加自定义Filter
class KeywordFilter(logging.Filter):def __init__(self, keyword):self.keyword = keyworddef filter(self, record):return self.keyword in record.getMessage()# 应用Filter
logger.addFilter(KeywordFilter('important'))# 不同级别的日志记录
logger.debug("This is a debug message")
logger.info("This is an important info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")

在这个例子中,我们定义了一个KeywordFilter类,它接受一个关键字作为参数,然后在filter方法中检查该关键字是否出现在日志消息中。通过使用这个自定义的Filter,我们可以只保留包含特定关键字的日志记录。

1.6 使用QueueHandler进行异步日志处理

当需要在多线程或多进程环境中使用logging库时,可以考虑使用QueueHandler来实现异步的日志处理。QueueHandler允许将日志消息放入队列中,然后由单独的线程或进程处理这些消息,以避免阻塞主程序。

import logging
import queue
import threading# 创建队列
log_queue = queue.Queue()# 创建QueueHandler
queue_handler = logging.handlers.QueueHandler(log_queue)# 获取Logger对象
logger = logging.getLogger(__name__)# 添加QueueHandler
logger.addHandler(queue_handler)# 在另一个线程中处理日志消息
def log_consumer():while True:record = log_queue.get()if record is None:breaklogger.handle(record)# 启动消费者线程
consumer_thread = threading.Thread(target=log_consumer)
consumer_thread.start()# 不同级别的日志记录
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")# 停止消费者线程
log_queue.put(None)
consumer_thread.join()

在这个例子中,我们创建了一个QueueHandler并将其添加到Logger中。然后,启动了一个消费者线程,它从队列中获取日志消息并由Logger处理。这种方式使得日志处理可以在后台进行,不会阻塞主程序的执行。

2. loguru库

2.1 Loguru简介

loguru库是一个简单而强大的日志记录库,提供了直观的API和丰富的功能。

2.2 简化的日志记录语法
from loguru import logger# 基本用法
logger.info("This is an info message")
logger.warning("This is a warning message")
2.3 自定义格式和输出目标
from loguru import logger# 自定义输出格式
logger.add("file.log", format="{time} - {level} - {message}", rotation="1 day", level="INFO")# 不同级别的日志记录
logger.info("This is an info message")
logger.warning("This is a warning message")
2.4 基于日志记录的条件触发

loguru提供了一种基于日志记录内容的条件触发机制,可以在满足特定条件时执行相应的操作。

from loguru import logger# 条件触发,记录包含关键字的日志并执行操作
logger.add(lambda record: "important" in record["message"], level="INFO", colorize=True)# 不同级别的日志记录
logger.info("This is an info message")
logger.info("This is an important info message")
logger.warning("This is a warning message")

在上述例子中,我们使用add方法添加了一个条件触发器,当日志中包含关键字"important"时,触发器将设置日志级别为INFO,并应用颜色。

2.5 动态修改日志记录格式

loguru允许在运行时动态修改日志记录的格式,使得我们可以根据需要实时调整日志格式。

from loguru import logger# 初始输出格式
logger.info("This is the default format")# 动态修改输出格式
logger.remove()
logger.add("file.log", format="{time} - {level} - {message}", rotation="1 day", level="INFO")
logger.info("This message has a different format and is saved to a file")

在这个例子中,我们首先使用默认格式记录了一条日志,然后通过remove方法删除了之前的输出目标,再使用add方法动态添加了一个新的输出目标,实现了动态修改日志记录格式。

2.6 将日志输出到多个目标

loguru支持将日志输出到多个目标,比如同时输出到控制台和文件。

from loguru import logger# 输出到控制台和文件
logger.add("file.log", format="{time} - {level} - {message}", rotation="1 day", level="INFO")
logger.add(lambda record: record["level"].name == "WARNING", colorize=True)# 不同级别的日志记录
logger.info("This is an info message")
logger.warning("This is a warning message")

在这个例子中,我们通过add方法添加了两个输出目标,一个输出到文件,一个通过条件触发器将WARNING级别的日志输出到控制台并添加颜色。

3. sentry库

3.1 Sentry概述

Sentry是一个用于实时错误监控和追踪的服务,帮助开发者快速发现并解决问题。

3.2 整合Sentry进行错误监控
import sentry_sdk# 安装Sentry SDK
# pip install sentry-sdk# 初始化Sentry
sentry_sdk.init("<your-sentry-dsn>")try:# 产生一个异常1 / 0
except Exception as e:# 捕获异常并发送到Sentrysentry_sdk.capture_exception(e)
3.3 错误追踪和报告
import sentry_sdk# 初始化Sentry
sentry_sdk.init("<your-sentry-dsn>")try :# 产生一个异常1 / 0
except Exception as e:# 捕获异常并发送到Sentrysentry_sdk.capture_exception(e)
3.4 自定义Sentry事件处理

除了基本的错误捕获外,sentry_sdk还提供了自定义事件处理的功能,允许开发者更灵活地处理并发送事件。

import sentry_sdk
from sentry_sdk import capture_message# 初始化Sentry
sentry_sdk.init("<your-sentry-dsn>")# 自定义事件处理函数
def my_event_processor(event, hint):# 在这里添加自定义处理逻辑event["user"] = {"id": "123"}return event# 添加自定义事件处理
sentry_sdk.add_event_processor(my_event_processor)# 手动捕获并发送事件
try:1 / 0
except Exception as e:capture_message("An error occurred", hint={"exc_info": (type(e), e, e.__traceback__)})

在这个例子中,我们定义了一个名为my_event_processor的自定义事件处理函数,并通过add_event_processor方法添加。这样,当手动捕获并发送事件时,该处理函数将被调用,我们可以在其中添加自定义的事件处理逻辑。

3.5 Sentry上下文信息

Sentry允许开发者添加上下文信息,以便更好地理解和排查问题。这些上下文信息可以是用户信息、环境变量等。

import sentry_sdk
from sentry_sdk import push_scope# 初始化Sentry
sentry_sdk.init("<your-sentry-dsn>")# 添加上下文信息
with push_scope() as scope:scope.user = {"id": "123", "username": "john_doe"}scope.set_tag("environment", "production")# 手动捕获并发送事件
try:1 / 0
except Exception as e:sentry_sdk.capture_exception(e)

在这个例子中,我们使用push_scope方法创建了一个上下文范围,然后在范围内设置了用户信息和环境标签。这些上下文信息将与后续手动捕获并发送的事件关联起来,提供更全面的信息。

3.6 Sentry事件的重试和忽略

在某些情况下,当事件发送失败时,Sentry提供了重试机制,确保事件最终能够被成功发送。同时,我们也可以配置忽略某些特定类型的事件,以防止不必要的报警。

import sentry_sdk# 初始化Sentry,配置事件重试和忽略特定类型的事件
sentry_sdk.init("<your-sentry-dsn>", send_default_pii=True, max_breadcrumbs=50, before_send=before_send_func)# 手动捕获并发送事件
try:1 / 0
except Exception as e:sentry_sdk.capture_exception(e)

在这个例子中,我们通过send_default_pii开启了默认的个人身份信息(PII)发送,通过max_breadcrumbs设置了最大的面包屑数量,通过before_send设置了在发送事件之前执行的自定义函数。before_send_func函数可以根据需求进行事件的修改、过滤或者忽略。

这些配置选项使得我们能够更加灵活地控制Sentry的行为,确保事件能够被有效地处理。

3.7 Sentry环境集成

Sentry可以集成到不同的环境中,以更好地适应不同的应用场景。以下是一些环境集成的示例。

import sentry_sdk
from sentry_sdk.integrations.redis import RedisIntegration
from sentry_sdk.integrations.celery import CeleryIntegration# 初始化Sentry,集成到Redis和Celery
sentry_sdk.init("<your-sentry-dsn>",integrations=[RedisIntegration(), CeleryIntegration()]
)# 手动捕获并发送事件
try:1 / 0
except Exception as e:sentry_sdk.capture_exception(e)

在这个例子中,我们通过integrations参数集成了RedisCelery。这样,Sentry将能够更好地理解和处理与这两个组件相关的事件。

通过对Sentry库的深入了解,我们可以更灵活地配置和使用它,以满足复杂应用场景中的需求。

4. pdb库

4.1 使用Python调试器(pdb)
# 脚本中插入断点
import pdbdef example_function():x = 1y = 0result = x / yreturn resultpdb.set_trace()
result = example_function()
print(result)
4.2 设置断点和追踪执行
# 脚本中插入断点
import pdbdef example_function():x = 1y = 0result = x / yreturn resultpdb.set_trace()
result = example_function()
print(result)
4.3 调试技巧和命令
# 脚本中插入断点
import pdbdef example_function():x = 1y = 0result = x / yreturn resultpdb.set_trace()
result = example_function()
print(result)
4.4 条件断点

pdb允许设置条件断点,即只在满足特定条件时才触发断点。

# 条件断点
import pdbdef example_function():x = 1y = 0result = x / yreturn result# 设置条件断点,仅当y非零时触发断点
pdb.set_trace() if y != 0 else None
result = example_function()
print(result)

在这个例子中,我们使用了条件表达式,只有当y非零时才触发断点。这对于在特定条件下进行调试非常有用。

4.5 运行时修改变量值

pdb允许在断点处运行时修改变量的值,以测试不同的场景。

# 运行时修改变量值
import pdbdef example_function():x = 1y = 0result = x / yreturn resultpdb.set_trace()
y = 2  # 在断点处运行时修改变量值
result = example_function()
print(result)

在这个例子中,在断点处我们修改了变量y的值,使得程序在后续执行中产生不同的结果。这样可以帮助我们快速测试不同的输入。

4.6 单步执行和查看变量值

pdb支持单步执行代码,以及查看当前变量的值。

# 单步执行和查看变量值
import pdbdef example_function():x = 1y = 0result = x / yreturn resultpdb.set_trace()
result = example_function()
print(result)

在断点处,使用n命令可以单步执行代码,使用p variable可以查看特定变量的值。这对于逐行调试和变量跟踪非常有帮助。

4.7 脚本中插入多个断点

在脚本中,我们可以插入多个断点,以在不同的代码位置进行调试。

# 脚本中插入多个断点
import pdbdef example_function():x = 1pdb.set_trace()  # 第一个断点y = 0result = x / ypdb.set_trace()  # 第二个断点return resultpdb.set_trace()  # 第三个断点
result = example_function()
print(result)

在这个例子中,我们在脚本中插入了三个断点,分别位于不同的代码位置。这样可以更灵活地进行调试,观察不同阶段的程序状态。

5. py-spy库

5.1 使用py-spy进行性能分析
# 安装py-spy
# pip install py-spy# 查看程序性能
py-spy top
5.2 CPU性能分析
# 生成CPU火焰图
py-spy top --flame profile.svg
5.3 分析运行中的Python程序
# 连接到运行中的Python进程
py-spy top -p <pid>
5.4 采样间隔和持续监测

py-spy允许设置采样间隔和持续监测的时间,以更灵活地适应不同的性能分析需求。

# 设置采样间隔和持续监测时间
py-spy top --interval 100ms --duration 30

在这个例子中,我们通过--interval参数设置了采样间隔为100毫秒,通过--duration参数设置了持续监测时间为30秒。这样可以在较短的时间内获取更多的性能数据。

5.5 使用py-spy记录性能数据

py-spy可以将性能数据记录到文件中,以便后续分析和可视化。

# 记录性能数据到文件
py-spy top --output profile.json

通过将性能数据输出到文件,我们可以在离线状态下进行更深入的分析和探索。

5.6 绘制火焰图

火焰图是一种直观的性能分析可视化工具,py-spy支持生成火焰图。

# 生成火焰图
py-spy top --flame profile.svg

通过生成火焰图,我们可以清晰地了解程序中各个函数的调用关系和执行时间,帮助快速定位性能瓶颈。

6. debugpy库

6.1 debugpy简介

debugpy库提供了远程调试和代码跟踪的功能,方便开发者在生产环境中调试程序。

6.2 远程调试和代码跟踪
# 安装debugpy
# pip install debugpyimport debugpy# 启用远程调试
debugpy.listen(("0.0.0.0", 5678))
6.3 高级调试功能

在开发过程中,可能需要更进一步的调试工具和技术来解决复杂的问题。debugpy提供了一些高级调试功能,使得在开发和维护代码时更加便捷。

6.3.1 条件断点

debugpy中设置条件断点,可以根据指定的条件在程序执行到相应位置时触发断点。

# 安装debugpy
# pip install debugpyimport debugpy# 启用远程调试
debugpy.listen(("0.0.0.0", 5678))# 你的Python代码
for i in range(10):if i == 5:debugpy.breakpoint()  # 设置条件断点print(i)

在上述例子中,当i的值等于5时,将触发条件断点。

6.3.2 变量查看

使用VS Code等支持debugpy的工具,可以方便地查看代码执行过程中变量的值。

# 安装debugpy
# pip install debugpyimport debugpy# 启用远程调试
debugpy.listen(("0.0.0.0", 5678))# 你的Python代码
x = 10
y = 5
result = x / y# 在VS Code中查看变量值
# 可以在这里设置断点,然后在调试器中查看变量值
6.3.3 代码跟踪

trace_function_callsdebugpy的一个功能,它可以追踪函数的调用过程,有助于理解代码的执行流程。

# 安装debugpy
# pip install debugpyimport debugpy# 启用远程调试
debugpy.listen(("0.0.0.0", 5678))# 启用代码跟踪
debugpy.trace_function_calls(True)# 你的Python代码
# ...

在上述例子中,启用了代码跟踪功能后,可以在控制台中看到函数的调用信息,这对于理解程序的执行流程非常有帮助。

这些高级调试功能可以在复杂的代码中提供更深入的调试支持,使得开发人员更容易定位和解决问题。

6.3.4 中断运行中的程序

debugpy允许在程序运行时中断执行,以便进行交互式的调试。

# 安装debugpy
# pip install debugpyimport debugpy# 启用远程调试
debugpy.listen(("0.0.0.0", 5678))# 在程序中断执行
debugpy.breakpoint()
# 你的Python代码
# ...

在这个例子中,通过在代码中插入debugpy.breakpoint(),可以在程序执行到该位置时中断执行,进入调试状态,从而进行交互式的调试。

6.3.5 远程调试

debugpy支持远程调试,使得可以在远程服务器上调试本地代码。

# 安装debugpy
# pip install debugpyimport debugpy# 启用远程调试,指定主机和端口
debugpy.listen(("0.0.0.0", 5678))

通过在代码中插入debugpy.listen并指定主机和端口,可以在远程服务器上启动debugpy调试服务器,然后通过本地调试工具连接到远程服务器进行调试。

6.3.6 异步代码调试

debugpy对异步代码提供了良好的支持,可以方便地进行异步程序的调试。

# 安装debugpy
# pip install debugpyimport debugpy# 启用远程调试
debugpy.listen(("0.0.0.0", 5678))# 在异步代码中插入断点
async def async_example():debugpy.breakpoint()# 异步代码# ...# 你的Python代码
# ...

在这个例子中,通过在异步函数中插入debugpy.breakpoint(),可以在异步代码执行到该位置时中断执行,进行异步代码的调试。

6.3.7 多进程调试

debugpy还支持多进程调试,可以同时调试多个Python进程。

# 安装debugpy
# pip install debugpyimport debugpy# 启用远程调试
debugpy.listen(("0.0.0.0", 5678))# 在多进程代码中插入断点
from   multiprocessing import Processdef process_example():debugpy.breakpoint()# 多进程代码# ...# 启动多进程
process = Process(target=process_example)
process.start()
process.join()# 你的Python代码
# ...

通过在多进程代码中插入debugpy.breakpoint(),可以在每个进程执行到该位置时中断执行,方便进行多进程调试。

这些高级调试功能使得debugpy成为一个强大的调试工具,适用于各种复杂的调试场景。

总结

通过学习本文介绍的各种调试和性能优化工具,Python开发者将能够更轻松地管理和维护他们的代码。正确配置和使用logging库,采用现代的loguru库简化日志记录,整合Sentry进行实时错误监控,以及通过pdbdebugpypy-spy实现高级的调试和性能分析,都将帮助开发者更快速、更准确地发现和解决问题,提高代码质量。

这篇关于【Python百宝箱】优化Python开发体验:日志记录、错误监控与高级调试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/523010

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设