数据仓库系列13:增量更新和全量更新有什么区别,如何选择?

news2024/9/22 7:26:06

你是否曾经在深夜加班时,面对着庞大的数据仓库,思考过这样一个问题:“我应该选择增量更新还是全量更新?” 这个看似简单的选择,却可能影响整个数据处理的效率和准确性。今天,让我们深入探讨这个数据仓库领域的核心问题,揭示增量更新和全量更新的秘密,帮助你在实际工作中做出明智的选择。
image.png

目录

    • 引言:数据更新的重要性
    • 增量更新vs全量更新:基本概念
    • 增量更新的优势与挑战
      • 优势
      • 挑战
      • 示例:增量更新实现
    • 全量更新的优势与挑战
      • 优势
      • 挑战
      • 示例:全量更新实现
    • 如何选择更新策略:决策框架
      • 决策树示例
    • 实战案例:电商订单数据更新
      • 场景分析
      • 增量更新方案
      • 全量更新方案
      • 选择建议
    • 性能优化技巧
      • 1. 索引优化
      • 2. 分区表
      • 3. 批量处理
      • 4. 并行处理
    • 常见陷阱与解决方案
      • 1. 死锁问题
      • 2. 数据不一致
      • 3. 性能瓶颈
    • 未来趋势:实时数据更新
      • 实时更新的优势
      • 实现实时更新的技术
      • 示例:使用Kafka实现实时更新
    • 结论

引言:数据更新的重要性

在大数据时代,数据仓库已经成为企业决策的核心基础设施。而保持数据的及时性和准确性,则是数据仓库发挥作用的关键。无论是增量更新还是全量更新,都是为了实现这一目标的重要手段。选择合适的更新策略,不仅可以提高数据处理效率,还能确保数据质量,进而支持更好的业务决策。
image.png

增量更新vs全量更新:基本概念

在深入讨论之前,让我们先明确这两个概念:

  • 增量更新(Incremental Update):只处理自上次更新以来发生变化的数据。
  • 全量更新(Full Update):每次更新时处理整个数据集。

这两种方法各有优缺点,选择哪一种取决于多个因素,包括数据量、更新频率、系统资源等。
image.png

增量更新的优势与挑战

优势

  1. 效率高:只处理变化的数据,大大减少了处理时间和资源消耗。
  2. 实时性强:可以更频繁地进行更新,保持数据的新鲜度。
  3. 网络带宽友好:减少数据传输量,特别适合分布式系统。
    image.png

挑战

  1. 复杂性:需要设计和维护变更跟踪机制。
  2. 一致性风险:如果增量更新失败,可能导致数据不一致。
  3. 历史数据管理:需要考虑如何处理和存储历史变更记录。

示例:增量更新实现

以下是一个简单的Python代码示例,展示了增量更新的基本逻辑:

import pandas as pd
from datetime import datetime

def incremental_update(existing_data, new_data, key_column, timestamp_column):
    # 合并现有数据和新数据
    combined_data = pd.concat([existing_data, new_data])
    
    # 根据key列和时间戳列去重,保留最新的记录
    updated_data = combined_data.sort_values(timestamp_column, ascending=False) \
                                .drop_duplicates(subset=[key_column], keep='first')
    
    return updated_data

# 示例使用
existing_data = pd.DataFrame({
    'id': [1, 2, 3],
    'value': [100, 200, 300],
    'last_updated': ['2023-01-01', '2023-01-02', '2023-01-03']
})

new_data = pd.DataFrame({
    'id': [2, 4],
    'value': [250, 400],
    'last_updated': ['2023-01-04', '2023-01-04']
})

result = incremental_update(existing_data, new_data, 'id', 'last_updated')
print(result)

这个例子展示了如何使用Pandas进行简单的增量更新。它合并现有数据和新数据,然后根据ID和时间戳去重,保留最新的记录。

全量更新的优势与挑战

image.png

优势

  1. 简单直接:实现逻辑简单,不需要复杂的变更跟踪机制。
  2. 数据一致性好:每次更新都是完整的数据集,降低了数据不一致的风险。
  3. 适合大规模重构:当数据模型发生重大变化时,全量更新更容易实现。

挑战

  1. 资源消耗大:每次都处理全部数据,对系统资源要求高。
  2. 更新时间长:特别是对于大型数据集,可能需要很长时间才能完成更新。
  3. 不适合频繁更新:由于更新时间长,难以实现高频率的数据刷新。

示例:全量更新实现

image.png

以下是一个全量更新的Python代码示例:

import pandas as pd

def full_update(source_data, destination_table):
    # 清空目标表
    destination_table.truncate()
    
    # 将源数据全量写入目标表
    destination_table.append(source_data)
    
    print(f"Full update completed. {len(source_data)} records updated.")

# 示例使用
source_data = pd.DataFrame({
    'id': [1, 2, 3, 4],
    'value': [100, 250, 300, 400],
    'last_updated': ['2023-01-01', '2023-01-04', '2023-01-03', '2023-01-04']
})

destination_table = pd.DataFrame(columns=['id', 'value', 'last_updated'])

full_update(source_data, destination_table)
print(destination_table)

这个例子展示了全量更新的基本逻辑:首先清空目标表,然后将源数据完整地写入。虽然实现简单,但对于大型数据集可能会非常耗时。

如何选择更新策略:决策框架

image.png

选择合适的更新策略是一个复杂的决策过程,需要考虑多个因素。以下是一个简单的决策框架:

  1. 数据量

    • 大数据量(TB级以上):倾向于增量更新
    • 小数据量:可以考虑全量更新
  2. 更新频率

    • 高频更新(每小时或更频繁):增量更新
    • 低频更新(每天或更少):全量更新可能更简单
  3. 数据变化率

    • 高变化率(>30%数据经常变化):全量更新可能更简单
    • 低变化率:增量更新更有效
  4. 系统资源

    • 资源受限:增量更新
    • 资源充足:可以考虑全量更新
  5. 数据一致性要求

    • 极高一致性要求:可能需要全量更新
    • 可以容忍短暂不一致:增量更新更灵活
  6. 数据模型复杂度

    • 简单模型:两种方法都可以
    • 复杂模型(多表关联、复杂转换):增量更新可能更具挑战性
  7. 历史数据需求

    • 需要详细的历史记录:增量更新更适合
    • 只关注当前状态:全量更新足够
  8. 技术栈和工具支持

    • 某些工具可能更适合特定的更新策略

决策树示例

开始
数据量大吗?
更新频率高吗?
系统资源充足吗?
增量更新
数据变化率高吗?
全量更新
数据一致性要求高吗?

这个决策树可以帮助你快速判断应该选择哪种更新策略。但请记住,这只是一个简化的模型,实际决策可能需要考虑更多因素。

实战案例:电商订单数据更新

让我们通过一个实际的案例来深入理解增量更新和全量更新的应用。

假设我们在管理一个电商平台的订单数据仓库。每天,我们需要从交易系统中提取新的订单数据,更新到数据仓库中。订单数据包括订单ID、客户ID、订单状态、订单金额和下单时间等信息。

场景分析

image.png

  • 数据量:每天约100万新订单
  • 更新频率:每天一次
  • 数据变化:新订单不断产生,已有订单状态可能发生变化
  • 系统要求:需要支持实时报表和历史趋势分析

增量更新方案

image.png

import pandas as pd
from sqlalchemy import create_engine
from datetime import datetime, timedelta

def incremental_order_update(db_engine, last_update_time):
    # 从源系统获取新增和变更的订单数据
    query = f"""
    SELECT order_id, customer_id, order_status, order_amount, order_time
    FROM source_orders
    WHERE order_time >= '{last_update_time}'
       OR (order_status_update_time >= '{last_update_time}' AND order_status_update_time > order_time)
    """
    new_orders = pd.read_sql(query, db_engine)
    
    # 更新数据仓库
    with db_engine.begin() as conn:
        # 插入新订单
        new_orders.to_sql('dw_orders', conn, if_exists='append', index=False)
        
        # 更新已存在的订单状态
        for _, row in new_orders.iterrows():
            conn.execute(f"""
            UPDATE dw_orders
            SET order_status = '{row['order_status']}'
            WHERE order_id = {row['order_id']}
            """)
    
    print(f"Incremental update completed. {len(new_orders)} orders processed.")

# 示例使用
db_engine = create_engine('postgresql://username:password@localhost:5432/datawarehouse')
last_update_time = datetime.now() - timedelta(days=1)
incremental_order_update(db_engine, last_update_time)

这个增量更新方案的优点是:

  • 效率高:只处理新增和变更的订单
  • 支持实时性要求:可以频繁执行以获取最新数据
  • 保留历史记录:可以跟踪订单状态的变化

缺点是:

  • 实现相对复杂:需要跟踪上次更新时间,处理状态变更
  • 可能出现数据不一致:如果更新过程中断,可能导致部分数据未更新

全量更新方案

import pandas as pd
from sqlalchemy import create_engine

def full_order_update(db_engine):
    # 从源系统获取所有订单数据
    query = """
    SELECT order_id, customer_id, order_status, order_amount, order_time
    FROM source_orders
    """
    all_orders = pd.read_sql(query, db_engine)
    
    # 更新数据仓库
    with db_engine.begin() as conn:
        # 清空现有数据
        conn.execute("TRUNCATE TABLE dw_orders")
        
        # 插入所有订单
        all_orders.to_sql('dw_orders', conn, if_exists='append', index=False)
    
    print(f"Full update completed. {len(all_orders)} orders processed.")

# 示例使用
db_engine = create_engine('postgresql://username:password@localhost:5432/datawarehouse')
full_order_update(db_engine)

全量更新方案的优点是:

  • 实现简单:不需要跟踪变更
  • 数据一致性好:每次都是完整的数据集
  • 适合大规模重构:如果数据模型变化,容易适应

缺点是:

  • 资源消耗大:每次都处理全部数据
  • 更新时间长:特别是当订单数量巨大时
  • 不适合频繁更新:难以满足实时性要求

选择建议

image.png

对于这个电商订单场景,增量更新可能是更好的选择,原因如下:

  1. 数据量大且持续增长:每天100万新订单,全量更新将变得越来越慢
  2. 需要支持实时报表:增量更新可以更频繁地执行,提供近实时的数据
  3. 历史趋势分析需求:增量更新便于保留和跟踪订单状态的历史变化

然而,我们也可以考虑结合两种方法:

  • 日常使用增量更新保持数据的及时性
  • 定然而,我们也可以考虑结合两种方法:
  • 日常使用增量更新保持数据的及时性
  • 定期(如每周或每月)执行一次全量更新,以确保数据的完整性和一致性

性能优化技巧

image.png

无论选择增量更新还是全量更新,优化性能都是至关重要的。以下是一些通用的优化技巧:

1. 索引优化

对于增量更新和全量更新,合理的索引设计都能显著提升性能。

-- 为订单表创建合适的索引
CREATE INDEX idx_order_time ON dw_orders(order_time);
CREATE INDEX idx_order_status ON dw_orders(order_status);
CREATE INDEX idx_customer_id ON dw_orders(customer_id);

2. 分区表

对于大型表,使用分区可以提高查询和更新效率。

-- 创建按日期分区的订单表
CREATE TABLE dw_orders (
    order_id INT,
    customer_id INT,
    order_status VARCHAR(20),
    order_amount DECIMAL(10,2),
    order_time TIMESTAMP
) PARTITION BY RANGE (order_time);

-- 创建每月分区
CREATE TABLE dw_orders_y2023m01 PARTITION OF dw_orders
    FOR VALUES FROM ('2023-01-01') TO ('2023-02-01');

CREATE TABLE dw_orders_y2023m02 PARTITION OF dw_orders
    FOR VALUES FROM ('2023-02-01') TO ('2023-03-01');

-- ... 其他月份的分区

3. 批量处理

对于增量更新,采用批量处理可以减少数据库操作次数,提高效率。

def batch_incremental_update(db_engine, batch_size=1000):
    last_processed_id = 0
    while True:
        # 获取一批数据
        batch = pd.read_sql(f"""
            SELECT * FROM source_orders
            WHERE order_id > {last_processed_id}
            ORDER BY order_id
            LIMIT {batch_size}
        """, db_engine)
        
        if batch.empty:
            break
        
        # 处理这批数据
        with db_engine.begin() as conn:
            batch.to_sql('dw_orders', conn, if_exists='append', index=False)
        
        last_processed_id = batch['order_id'].max()
        print(f"Processed batch up to order_id {last_processed_id}")

4. 并行处理

利用多线程或分布式计算框架可以显著提升处理速度,特别是对于全量更新。

from concurrent.futures import ThreadPoolExecutor
import pandas as pd

def update_partition(partition_date, db_engine):
    query = f"""
    SELECT * FROM source_orders
    WHERE order_time >= '{partition_date}' AND order_time < '{partition_date + timedelta(days=1)}'
    """
    partition_data = pd.read_sql(query, db_engine)
    
    with db_engine.begin() as conn:
        partition_data.to_sql(f'dw_orders_{partition_date.strftime("%Y%m%d")}', 
                              conn, if_exists='replace', index=False)

def parallel_full_update(db_engine, start_date, end_date):
    dates = pd.date_range(start_date, end_date)
    with ThreadPoolExecutor(max_workers=4) as executor:
        executor.map(lambda date: update_partition(date, db_engine), dates)

# 使用示例
start_date = datetime(2023, 1, 1)
end_date = datetime(2023, 12, 31)
parallel_full_update(db_engine, start_date, end_date)

常见陷阱与解决方案

image.png

在实施增量更新和全量更新时,有一些常见的陷阱需要注意:

1. 死锁问题

陷阱:在高并发环境下,增量更新可能导致死锁。

解决方案

  • 使用乐观锁替代悲观锁
  • 合理设置事务隔离级别
  • 对大型更新操作进行分批处理
def safe_incremental_update(db_engine, data):
    with db_engine.begin() as conn:
        for _, row in data.iterrows():
            while True:
                try:
                    conn.execute("""
                        UPDATE dw_orders
                        SET order_status = %s
                        WHERE order_id = %s AND update_time < %s
                    """, (row['order_status'], row['order_id'], row['update_time']))
                    break
                except sqlalchemy.exc.OperationalError as e:
                    if 'deadlock detected' in str(e):
                        print(f"Deadlock detected for order {row['order_id']}, retrying...")
                        time.sleep(0.1)  # 短暂休眠后重试
                    else:
                        raise

2. 数据不一致

陷阱:增量更新过程中断可能导致数据不一致。

解决方案

  • 实现事务机制,确保更新的原子性
  • 使用检查点机制,记录更新进度
  • 定期进行全量校验
def incremental_update_with_checkpoint(db_engine, batch_size=1000):
    checkpoint = get_last_checkpoint()  # 从某个存储中获取上次的检查点
    
    while True:
        batch = get_next_batch(checkpoint, batch_size)  # 获取下一批数据
        if not batch:
            break
        
        try:
            with db_engine.begin() as conn:
                update_data(conn, batch)  # 更新数据
                update_checkpoint(conn, batch[-1]['id'])  # 更新检查点
        except Exception as e:
            print(f"Error occurred: {e}. Rolling back to last checkpoint.")
            # 错误发生时回滚到上一个检查点
    
    # 更新完成后进行全量校验
    validate_data_consistency(db_engine)

3. 性能瓶颈

陷阱:随着数据量增长,更新操作可能变得越来越慢。

解决方案

  • 优化数据库模式和索引
  • 实现增量更新和全量更新的混合策略
  • 考虑使用列式存储或其他适合大数据的存储方案
def hybrid_update_strategy(db_engine):
    current_time = datetime.now()
    
    # 每天执行增量更新
    if current_time.hour == 1:  # 假设在每天凌晨1点执行
        incremental_update(db_engine)
    
    # 每周日执行全量更新
    if current_time.weekday() == 6 and current_time.hour == 2:
        full_update(db_engine)
    
    # 每月最后一天执行数据校验
    last_day_of_month = (current_time.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)
    if current_time.date() == last_day_of_month.date() and current_time.hour == 3:
        validate_data_consistency(db_engine)

未来趋势:实时数据更新

随着技术的发展,实时数据处理正成为一种新的趋势。这种方法可以看作是增量更新的极致形式,它能够在数据生成的瞬间就进行处理和更新。
image.png

实时更新的优势

  1. 极低的延迟:数据几乎可以实时反映在报表和分析中。
  2. 资源利用更均匀:避免了传统批处理方式的资源使用峰值。
  3. 更好的用户体验:为基于数据的实时决策提供支持。

实现实时更新的技术

  1. 流处理框架:如Apache Kafka、Apache Flink等。
  2. 变更数据捕获(CDC):直接从数据库事务日志中捕获变更。
  3. 内存数据网格:如Apache Ignite,提供内存中的数据处理能力。

示例:使用Kafka实现实时更新

from kafka import KafkaConsumer
from json import loads

consumer = KafkaConsumer(
    'order_topic',
     bootstrap_servers=['localhost:9092'],
     auto_offset_reset='earliest',
     enable_auto_commit=True,
     group_id='order-processing-group',
     value_deserializer=lambda x: loads(x.decode('utf-8'))
)

def process_order(order):
    # 处理订单数据
    with db_engine.begin() as conn:
        conn.execute("""
            INSERT INTO dw_orders (order_id, customer_id, order_status, order_amount, order_time)
            VALUES (%s, %s, %s, %s, %s)
            ON CONFLICT (order_id) DO UPDATE
            SET order_status = EXCLUDED.order_status,
                order_amount = EXCLUDED.order_amount
        """, (order['order_id'], order['customer_id'], order['order_status'], 
              order['order_amount'], order['order_time']))

for message in consumer:
    order = message.value
    process_order(order)

这个例子展示了如何使用Kafka消费者来实时处理订单数据。每当有新的订单或订单状态变更时,都会立即反映到数据仓库中。

然而,实时更新也带来了新的挑战:

  1. 系统复杂性增加:需要管理和维护实时处理管道。
  2. 一致性保证更困难:在分布式系统中确保数据一致性变得更加复杂。
  3. 错误处理和恢复:实时系统需要更健壮的错误处理机制。

因此,在决定是否采用实时更新策略时,需要权衡其带来的好处和增加的复杂性。

结论

image.png
选择增量更新还是全量更新,或是采用混合策略,没有一刀切的答案。这取决于你的具体业务需求、数据特征、系统资源和技术能力。

  • 增量更新适合数据量大、变化频繁、需要近实时更新的场景。它能提供更好的性能和更低的资源消耗,但实现复杂度较高。

  • 全量更新适合数据量较小、变化不频繁、对一致性要求高的场景。它实现简单,确保数据完整性,但对大型数据集可能效率较低。

  • 混合策略结合了两者的优点,可以在日常使用增量更新,定期进行全量更新和数据校验。

  • 实时更新是未来的趋势,适合对数据时效性要求极高的场景,但也带来了更高的系统复杂性。

在实际应用中,建议从以下几个方面来做出选择:

  1. 评估数据特征:包括数据量、更新频率、变化程度等。
  2. 分析业务需求:考虑数据时效性、一致性、历史追溯等需求。
  3. 权衡系统资源:评估可用的计算资源、存储容量和网络带宽。
  4. 考虑技术能力:评估团队实现和维护各种更新策略的能力。
  5. 进行性能测试:在实际或模拟环境中测试不同策略的性能。
  6. 制定监控和应急方案:无论选择哪种策略,都要有完善的监控和问题处理机制。

记住,选择更新策略不是一劳永逸的。随着业务的发展和技术的进步,你可能需要不断调整和优化你的数据更新策略。保持灵活性,定期评估和改进,才能确保你的数据仓库始终高效可靠地支持业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2096279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RT-DETR+Sort 实现目标跟踪

在前一篇博客中&#xff0c;博主介绍了利用YOLOv8与Sort算法实现目标跟踪&#xff0c;在今天这篇博客中&#xff0c;博主将利用RT-DETR算法与Sort算法相结合&#xff0c;从而实现目标跟踪。。 这里博主依旧是采用ONNX格式的模型文件来执行推理过程&#xff0c;由于Sort算法是基…

vue part6

Vue脚手&#xff08;CLI&#xff09; 第一步&#xff08;仅第一次执行&#xff09;&#xff1a;全局安装vue/cli。 npm install -g vue/cli- 第二步&#xff1a;切换到你要创建项目的目录&#xff0c;然后使用命令创建项目vue create xxxx&#xff08;项目名字&#xff09; 第…

el-table利用折叠面板 type=“expand“ 嵌套el-table,并实现 明细数据多选,选中明细数据后返回原数据得嵌套格式

效果图: 废话不多说直接上代码&#xff0c;完整代码展示&#xff1a; <template><el-tableborderref"multipleTable":data"tableData"tooltip-effect"dark"style"width: 100%"><el-table-columnwidth"50"la…

线程池在接受到30个比较耗时的任务时的状态,在前面30个比较耗时的任务还没执行完成的情况下,再来多少个任务会触发拒绝策略?

目录 一、提出问题 二、解答 问题 1: 线程池在接受到30个比较耗时的任务时的状态 问题 2: 在前面30个比较耗时的任务还没执行完成的情况下&#xff0c;再来多少个任务会触发拒绝策略&#xff1f; 总结 一、提出问题 我们首先自定义一个线程池&#xff1a; new ThreadPoo…

18042 计算分段函数值

### 伪代码 1. 读取输入的实数x。 2. 根据x的值计算y&#xff1a; - 如果x < 1&#xff0c;y x。 - 如果1 < x < 10&#xff0c;y 2x - 1。 - 如果x > 10&#xff0c;y 3x - 11。 3. 输出y的值&#xff0c;保留两位小数。 ### C代码 #include <io…

fl studio 21/24破解版(水果音乐制作软件24) v24.1.1.4285附安装教程

fl studio 21/24破解版&#xff0c;又被国内网友称之为水果音乐制作软件24&#xff0c;是Image-Line公司成立26周年而发布的一个版本&#xff0c;是目前互联网上最优秀的完整的软件音乐制作环境或数字音频工作站&#xff0c;包含了编排&#xff0c;录制&#xff0c;编辑&#x…

World of Warcraft [CLASSIC][80][Grandel] Call to Arms: Warsong Gulch

Call to Arms: Warsong Gulch - Quest - 魔兽世界怀旧服CTM4.34《大地的裂变》数据库_大灾变85级魔兽数据库_ctm数据库 10人PVP战歌峡谷&#xff0c;该战场经常用来互刷军衔和荣誉&#xff0c;哈哈 wow plugin_魔兽世界挂机插件-CSDN博客

完美解决node-sass@4.14.1 postinstall: `node scripts/build.js` 问题

node v14.16.0 安装node-sass4.14.1会出现报错 看日志排查发现设置的源国内的都有问题 直接梯子下载&#xff1a; https://github.com/sass/node-sass/releases/download/v4.14.1/win32-x64-83_binding.node 本地启动phpstudy&#xff0c;当然你也可以放在你服务器上&#xff0…

学习笔记 ---- 数论分块(整除分块)

文章目录 算法概述引理引理 1 1 1引理 2 2 2 数论分块结论&#xff08;区间右端点公式&#xff09;过程 N N N 维数论分块向上取整的数论分块 例题 H ( n ) H(n) H(n)[CQOI2007] 余数求和[清华集训2012] 模积和 算法 概述 数论分块可以快速计算一些含有除法向下取整的和式(即…

掌握 SQL 数据操纵的基础技巧

在数据库管理中&#xff0c;SQL 数据操纵语言 (DML) 是至关重要的工具。它主要包括 INSERT、UPDATE 和 DELETE 语句&#xff0c;用于对数据库中的数据进行插入、更新和删除操作。本文将带你快速了解这些基本操作。 插入数据 在创建了一个表之后&#xff0c;最常见的操作就是插…

基于SpringBoot+Vue+MySQL的的宠物商城网站

系统背景 基于SpringBootVueMySQL的宠物商城网站是一个结合了现代Web开发技术的综合性电商平台&#xff0c;专为宠物爱好者及宠物商家设计。该系统背景可以从多个方面来阐述&#xff0c;包括但不限于市场需求、技术选型、用户体验以及平台价值等方面。 1. 市场需求 随着人们生…

python内置模块time详解(我们需要了解的多种时间格式)

Python的time模块提供了各种与时间相关的函数。我们可以获取当前时间、操作时间日期、计算两个时间差等。 时间有两种标准表示法: 数字表示: 整数或浮点数&#xff0c;通常是自从1970年1月1日以来的秒数。9个整数组成的元组&#xff1a;元组项包含年份&#xff0c;月份&#…

第 4 章 第 4 章 卷积神经网络-datawhale ai夏令营

独热向量 y ′ 的长度决 定了模型可以识别出多少不同种类的东西。我们希望 y ′ 和 yˆ 的交叉熵越小越好。 为了避免过拟合&#xff0c;在做图像识别的时候&#xff0c;考虑到图像本身的特性&#xff0c;并不一定 需要全连接&#xff0c;即不需要每个神经元跟输入的每个维度都…

进程通信——消息队列

文章目录 1.概念1.0 IPC1.1 什么是消息队列1.2 消息队列工作机制1.3 消息队列与其他进程通信机制的比较&#xff1a; 2.使用System-V版2.1 用户消息缓冲区2.2 创建消息队列msgget2.3 添加消息到消息队列msgsend2.4 从消息队列读取消息、2.5 消息队列的控制函数msgctrl2.6 msqid…

SpringBoot中,启动A服务,naocs却注册B服务,解决思路。

今天遇到了一个令我非常费解的报错&#xff0c;我明明启动的是auth服务&#xff0c;但是nacos愣是给我注册的patient服务&#xff0c;下面看看解决思路&#xff08;虽然我这个问题很乌龙&#xff0c;但如果真的是你的配置有问题&#xff0c;那么这篇文章也是可以帮助到你。&…

开源通用验证码识别OCR —— DdddOcr 源码赏析(二)

文章目录 前言DdddOcr分类识别调用识别功能classification 函数源码classification 函数源码解读1. 分类功能不支持目标检测2. 转换为Image对象3. 根据模型配置调整图片尺寸和色彩模式4. 图像数据转换为浮点数据并归一化5. 图像数据预处理6. 运行模型&#xff0c;返回预测结果 …

如何在Windows和Mac上免费提取RAR文件?这里有方法

序言 你有没有下载过一个文件,却发现它有一个奇怪的.rar文件扩展名?RAR是一种压缩文件格式,与ZIP文件非常相似,在本文中,我们将向你展示如何在Windows或macOS上打开RAR文件。 如何在Windows 11上打开RAR文件 Windows 11在2023年增加了对RAR文件的原生支持。从那时起,你…

前端框架vue3中的条件渲染(v-show,v-if,v-else-if,v-else)

目录 v-show: 需求&#xff1a; v-if 区别与v-show&#xff1a; v-if和v-show的选择&#xff1a; v-else-if和v-else 联合使用&#xff1a; v-show: 部分代码如图&#xff1a; <body><div id"root"><div ><h1>n的值为{{n}}</h1>…

【计算机网络】浏览器输入访问某网址时,后台流程是什么

在访问网址时&#xff0c;后台的具体流程可以因不同的网站、服务器和应用架构而异。 实际过程中可能还涉及更多的细节和步骤&#xff0c;如缓存处理、重定向、负载均衡等。 此外&#xff0c;不同的网站和应用架构可能会有不同的实现方式和优化策略。 部分特定网站或应用&#x…

数据仓库系列19:数据血缘分析在数据仓库中有什么应用?

你是否曾经在复杂的数据仓库中迷失方向&#xff0c;不知道某个数据是从哪里来的&#xff0c;又会流向何方&#xff1f;或者在处理数据质量问题时&#xff0c;无法快速定位根源&#xff1f;如果是这样&#xff0c;那么数据血缘分析将会成为你的得力助手&#xff0c;帮助你在数据…