DolphinDB分布式计算:MapReduce模

目录

    • 摘要
    • 一、分布式计算概述
      • [1.1 什么是分布式计算](#1.1 什么是分布式计算)
      • [1.2 分布式计算优势](#1.2 分布式计算优势)
      • [1.3 DolphinDB分布式计算特点](#1.3 DolphinDB分布式计算特点)
    • 二、MapReduce模式
      • [2.1 MapReduce原理](#2.1 MapReduce原理)
      • [2.2 Map阶段](#2.2 Map阶段)
      • [2.3 Reduce阶段](#2.3 Reduce阶段)
    • 三、分布式聚合
      • [3.1 基本分布式聚合](#3.1 基本分布式聚合)
      • [3.2 多维分布式聚合](#3.2 多维分布式聚合)
      • [3.3 分布式窗口聚合](#3.3 分布式窗口聚合)
    • 四、分布式JOIN
      • [4.1 分布式表JOIN](#4.1 分布式表JOIN)
      • [4.2 分区对齐JOIN](#4.2 分区对齐JOIN)
    • 五、任务调度
      • [5.1 查看任务状态](#5.1 查看任务状态)
      • [5.2 任务管理](#5.2 任务管理)
      • [5.3 并行度控制](#5.3 并行度控制)
    • 六、分布式计算优化
      • [6.1 分区裁剪](#6.1 分区裁剪)
      • [6.2 数据本地性](#6.2 数据本地性)
      • [6.3 结果缓存](#6.3 结果缓存)
    • 七、实战案例
      • [7.1 分布式数据统计](#7.1 分布式数据统计)
      • [7.2 分布式异常检测](#7.2 分布式异常检测)
    • 八、总结
    • 参考资料

摘要

本文深入讲解DolphinDB分布式计算技术。从分布式计算原理到MapReduce模式,从任务调度到结果合并,从分布式聚合到性能优化,全面介绍分布式计算的核心方法。通过丰富的代码示例,帮助读者掌握分布式计算的核心技能。


一、分布式计算概述

1.1 什么是分布式计算

分布式计算将计算任务分散到多个节点并行执行:
#mermaid-svg-qIXl8KX1SG6tWVzh{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qIXl8KX1SG6tWVzh .error-icon{fill:#552222;}#mermaid-svg-qIXl8KX1SG6tWVzh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qIXl8KX1SG6tWVzh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qIXl8KX1SG6tWVzh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qIXl8KX1SG6tWVzh .marker.cross{stroke:#333333;}#mermaid-svg-qIXl8KX1SG6tWVzh svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qIXl8KX1SG6tWVzh p{margin:0;}#mermaid-svg-qIXl8KX1SG6tWVzh .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster-label text{fill:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster-label span{color:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster-label span p{background-color:transparent;}#mermaid-svg-qIXl8KX1SG6tWVzh .label text,#mermaid-svg-qIXl8KX1SG6tWVzh span{fill:#333;color:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .node rect,#mermaid-svg-qIXl8KX1SG6tWVzh .node circle,#mermaid-svg-qIXl8KX1SG6tWVzh .node ellipse,#mermaid-svg-qIXl8KX1SG6tWVzh .node polygon,#mermaid-svg-qIXl8KX1SG6tWVzh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qIXl8KX1SG6tWVzh .rough-node .label text,#mermaid-svg-qIXl8KX1SG6tWVzh .node .label text,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape .label,#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape .label{text-anchor:middle;}#mermaid-svg-qIXl8KX1SG6tWVzh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qIXl8KX1SG6tWVzh .rough-node .label,#mermaid-svg-qIXl8KX1SG6tWVzh .node .label,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape .label,#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape .label{text-align:center;}#mermaid-svg-qIXl8KX1SG6tWVzh .node.clickable{cursor:pointer;}#mermaid-svg-qIXl8KX1SG6tWVzh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qIXl8KX1SG6tWVzh .arrowheadPath{fill:#333333;}#mermaid-svg-qIXl8KX1SG6tWVzh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qIXl8KX1SG6tWVzh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qIXl8KX1SG6tWVzh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qIXl8KX1SG6tWVzh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qIXl8KX1SG6tWVzh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qIXl8KX1SG6tWVzh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster text{fill:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh .cluster span{color:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qIXl8KX1SG6tWVzh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qIXl8KX1SG6tWVzh rect.text{fill:none;stroke-width:0;}#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape p,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qIXl8KX1SG6tWVzh .icon-shape .label rect,#mermaid-svg-qIXl8KX1SG6tWVzh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qIXl8KX1SG6tWVzh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qIXl8KX1SG6tWVzh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qIXl8KX1SG6tWVzh :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 分布式计算架构
客户端
协调节点
数据节点1
数据节点2
数据节点3
局部计算
结果合并
最终结果

1.2 分布式计算优势

优势 说明
并行计算 多节点并行
数据本地 计算靠近数据
可扩展 横向扩展
高可用 容错能力

1.3 DolphinDB分布式计算特点

特点 说明
自动分区 数据自动分布
自动调度 任务自动调度
自动合并 结果自动合并
透明访问 用户无感知

二、MapReduce模式

2.1 MapReduce原理

#mermaid-svg-kjhzp1frOWKwV4nV{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-kjhzp1frOWKwV4nV .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-kjhzp1frOWKwV4nV .error-icon{fill:#552222;}#mermaid-svg-kjhzp1frOWKwV4nV .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kjhzp1frOWKwV4nV .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kjhzp1frOWKwV4nV .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kjhzp1frOWKwV4nV .marker.cross{stroke:#333333;}#mermaid-svg-kjhzp1frOWKwV4nV svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kjhzp1frOWKwV4nV p{margin:0;}#mermaid-svg-kjhzp1frOWKwV4nV .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster-label text{fill:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster-label span{color:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster-label span p{background-color:transparent;}#mermaid-svg-kjhzp1frOWKwV4nV .label text,#mermaid-svg-kjhzp1frOWKwV4nV span{fill:#333;color:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .node rect,#mermaid-svg-kjhzp1frOWKwV4nV .node circle,#mermaid-svg-kjhzp1frOWKwV4nV .node ellipse,#mermaid-svg-kjhzp1frOWKwV4nV .node polygon,#mermaid-svg-kjhzp1frOWKwV4nV .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kjhzp1frOWKwV4nV .rough-node .label text,#mermaid-svg-kjhzp1frOWKwV4nV .node .label text,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape .label,#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape .label{text-anchor:middle;}#mermaid-svg-kjhzp1frOWKwV4nV .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-kjhzp1frOWKwV4nV .rough-node .label,#mermaid-svg-kjhzp1frOWKwV4nV .node .label,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape .label,#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape .label{text-align:center;}#mermaid-svg-kjhzp1frOWKwV4nV .node.clickable{cursor:pointer;}#mermaid-svg-kjhzp1frOWKwV4nV .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-kjhzp1frOWKwV4nV .arrowheadPath{fill:#333333;}#mermaid-svg-kjhzp1frOWKwV4nV .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kjhzp1frOWKwV4nV .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kjhzp1frOWKwV4nV .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kjhzp1frOWKwV4nV .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-kjhzp1frOWKwV4nV .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kjhzp1frOWKwV4nV .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-kjhzp1frOWKwV4nV .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster text{fill:#333;}#mermaid-svg-kjhzp1frOWKwV4nV .cluster span{color:#333;}#mermaid-svg-kjhzp1frOWKwV4nV div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kjhzp1frOWKwV4nV .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-kjhzp1frOWKwV4nV rect.text{fill:none;stroke-width:0;}#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape p,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-kjhzp1frOWKwV4nV .icon-shape .label rect,#mermaid-svg-kjhzp1frOWKwV4nV .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-kjhzp1frOWKwV4nV .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-kjhzp1frOWKwV4nV .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-kjhzp1frOWKwV4nV :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} MapReduce流程
输入数据
Map阶段
中间结果
Reduce阶段
最终结果

2.2 Map阶段

python 复制代码
// Map阶段:数据分片并行计算
// DolphinDB自动将数据分片到各节点

// 创建分布式表
db = database("dfs://mr_db", VALUE, 1..100)
schema = table(1:0, `device_id`timestamp`value,
               [INT, TIMESTAMP, DOUBLE])
db.createPartitionedTable(schema, `sensor_data, `device_id)

// 插入数据
loadTable("dfs://mr_db", "sensor_data").append!(
    table(
        take(1..100, 1000000) as device_id,
        take(now(), 1000000) as timestamp,
        rand(20.0..30.0, 1000000) as value
    )
)

// Map阶段:各分区并行计算
t = loadTable("dfs://mr_db", "sensor_data")

// 查询自动触发Map
select device_id, avg(value) as avg_value
from t
group by device_id

2.3 Reduce阶段

python 复制代码
// Reduce阶段:合并Map结果

// DolphinDB自动执行Reduce
// 例如:avg = sum / count
// Map: 各分区计算 sum, count
// Reduce: 合并 sum, count,计算 avg

// 分布式聚合
select device_id,
       avg(value) as avg_value,
       sum(value) as sum_value,
       max(value) as max_value,
       min(value) as min_value,
       count(*) as cnt
from t
group by device_id

三、分布式聚合

3.1 基本分布式聚合

python 复制代码
// 基本分布式聚合
t = loadTable("dfs://mr_db", "sensor_data")

// 分组聚合
select device_id,
       avg(value) as avg_value,
       std(value) as std_value,
       max(value) as max_value,
       min(value) as min_value
from t
group by device_id

3.2 多维分布式聚合

python 复制代码
// 多维分布式聚合
// 创建多分区表
db = database("dfs://multi_db", COMPO, [VALUE, 1..10, RANGE, 2024.01.01..2024.12.31])
schema = table(1:0, `device_id`date`value,
               [INT, DATE, DOUBLE])
db.createPartitionedTable(schema, `data, `device_id`date)

// 多维聚合
t = loadTable("dfs://multi_db", "data")

select device_id, month(date) as month,
       avg(value) as avg_value,
       sum(value) as sum_value
from t
group by device_id, month(date)

3.3 分布式窗口聚合

python 复制代码
// 分布式窗口聚合
select device_id,
       bar(timestamp, 1h) as hour,
       avg(value) as avg_value,
       max(value) as max_value
from t
group by device_id, bar(timestamp, 1h)

四、分布式JOIN

4.1 分布式表JOIN

python 复制代码
// 创建两个分布式表
db = database("dfs://join_db", VALUE, 1..100)

// 表1:传感器数据
schema1 = table(1:0, `device_id`timestamp`value,
                [INT, TIMESTAMP, DOUBLE])
db.createPartitionedTable(schema1, `sensor_data, `device_id)

// 表2:设备信息
schema2 = table(1:0, `device_id`device_name`location,
                [INT, STRING, STRING])
db.createTable(schema2, `device_info)

// 分布式JOIN
t1 = loadTable("dfs://join_db", "sensor_data")
t2 = loadTable("dfs://join_db", "device_info")

select t1.device_id, t1.timestamp, t1.value,
       t2.device_name, t2.location
from t1
left join t2 on t1.device_id = t2.device_id

4.2 分区对齐JOIN

python 复制代码
// 分区对齐JOIN:分区相同,性能更好
// 两表使用相同分区策略

db1 = database("dfs://aligned_db1", VALUE, 1..100)
db2 = database("dfs://aligned_db2", VALUE, 1..100)

// 创建相同分区的表
schema = table(1:0, `device_id`timestamp`value,
               [INT, TIMESTAMP, DOUBLE])
db1.createPartitionedTable(schema, `table1, `device_id)
db2.createPartitionedTable(schema, `table2, `device_id)

// 分区对齐JOIN
t1 = loadTable("dfs://aligned_db1", "table1")
t2 = loadTable("dfs://aligned_db2", "table2")

select t1.device_id, t1.value as value1, t2.value as value2
from t1
inner join t2 on t1.device_id = t2.device_id and t1.timestamp = t2.timestamp

五、任务调度

5.1 查看任务状态

python 复制代码
// 查看集群节点
getClusterPerf()

// 查看任务状态
getJobStat()

// 查看最近任务
getRecentJobs()

5.2 任务管理

python 复制代码
// 取消任务
cancelJob(jobId)

// 查看任务进度
getJobProgress(jobId)

5.3 并行度控制

python 复制代码
// 控制并行度
// 通过配置参数控制
// maxPartitionNumPerQuery: 单查询最大分区数
// maxQueryJobPerNode: 单节点最大并发查询

六、分布式计算优化

6.1 分区裁剪

python 复制代码
// 分区裁剪:只扫描需要的分区
t = loadTable("dfs://mr_db", "sensor_data")

// 不推荐:全表扫描
select count(*) from t

// 推荐:分区裁剪
select count(*) from t
where device_id in 1..10  // 只扫描10个分区

6.2 数据本地性

python 复制代码
// 数据本地性:计算靠近数据
// DolphinDB自动优化

// 分区策略影响数据本地性
// VALUE分区:相同key在同一节点
// RANGE分区:连续范围在同一节点

6.3 结果缓存

python 复制代码
// 结果缓存:避免重复计算
// 使用中间表缓存结果

// 计算并缓存
result = select device_id, avg(value) as avg_value
         from t
         group by device_id

// 后续使用缓存结果
select * from result where avg_value > 25

七、实战案例

7.1 分布式数据统计

python 复制代码
// ========== 分布式数据统计 ==========

// 创建分布式表
db = database("dfs://stats_db", VALUE, 1..1000)
schema = table(1:0, `device_id`timestamp`temperature`humidity`pressure,
               [INT, TIMESTAMP, DOUBLE, DOUBLE, DOUBLE])
db.createPartitionedTable(schema, `sensor_data, `device_id)

// 插入数据
loadTable("dfs://stats_db", "sensor_data").append!(
    table(
        take(1..1000, 10000000) as device_id,
        take(now(), 10000000) as timestamp,
        rand(20.0..30.0, 10000000) as temperature,
        rand(40.0..60.0, 10000000) as humidity,
        rand(1000.0..1020.0, 10000000) as pressure
    )
)

// 分布式统计
t = loadTable("dfs://stats_db", "sensor_data")

// 设备级统计
select device_id,
       count(*) as cnt,
       avg(temperature) as avg_temp,
       std(temperature) as std_temp,
       max(temperature) as max_temp,
       min(temperature) as min_temp
from t
group by device_id

// 时间窗口统计
select device_id, bar(timestamp, 1h) as hour,
       avg(temperature) as avg_temp,
       avg(humidity) as avg_humidity
from t
group by device_id, bar(timestamp, 1h)

7.2 分布式异常检测

python 复制代码
// ========== 分布式异常检测 ==========

// 分布式计算统计指标
stats = select device_id,
               avg(temperature) as avg_temp,
               std(temperature) as std_temp
        from t
        group by device_id

// 分布式检测异常
select t.device_id, t.timestamp, t.temperature,
       abs(t.temperature - stats.avg_temp) > 3 * stats.std_temp as is_anomaly
from t
left join stats on t.device_id = stats.device_id
where abs(t.temperature - stats.avg_temp) > 3 * stats.std_temp

八、总结

本文详细介绍了DolphinDB分布式计算:

  1. 分布式原理:并行计算、数据本地性
  2. MapReduce模式:Map阶段、Reduce阶段
  3. 分布式聚合:基本聚合、多维聚合、窗口聚合
  4. 分布式JOIN:分区对齐、性能优化
  5. 任务调度:任务管理、并行度控制
  6. 性能优化:分区裁剪、数据本地性、结果缓存

思考题

  1. 如何设计分布式计算任务?
  2. MapReduce模式有什么优势?
  3. 如何优化分布式计算性能?

参考资料

相关推荐
薛定谔的悦2 小时前
储能 EMS 的功率策略:从一块电表到一次逆流的 200 毫秒
大数据·linux·能源·储能·bms
2601_962218475 小时前
万象生鲜系统区块链溯源技术帮助生鲜企业搭建食品安全数字化体系
大数据·运维·微服务·云原生·架构
东方-教育技术博主6 小时前
自动编码在教育场景中的重要性:一项基于多源证据的深度综述
大数据·人工智能
liuqs3326 小时前
机器人产业加速发展,制造业正在迎来新的自动化探索
大数据·人工智能
腾讯云大数据6 小时前
DataBuddy数据语义驱动的企业Agent Runtime实践
大数据·人工智能·腾讯云·agent
cvcode_study6 小时前
Ollama+ComfyUI 多模态
大数据·人工智能·python
四方云7 小时前
把电话能力无缝嵌入企业自有CRM
大数据·人工智能
STQY燊桐启元(深圳)电子科技7 小时前
医疗精密电源散热方案:相变陶瓷片保障医疗设备长效稳定低干扰
大数据·网络·人工智能
陕西企来客8 小时前
2026年8月买门窗主要看什么参数?选购攻略
大数据·买门窗主要看什么参数
林澈在路上9 小时前
AI翻唱软件哪个好 2026国产AI写歌工具对比推荐
大数据·人工智能·深度学习·github·aigc·音视频·音频