当前位置: 首页 > article >正文

DeepSeek总结的DuckLake 中的数据内联:为数据湖解锁流式处理

原文地址https://ducklake.select/2026/04/02/data-inlining-in-ducklake/DuckLake 中的数据内联为数据湖解锁流式处理Pedro Holanda2026-04-02 ·TL;DRDuckLake 的数据内联功能将小批量更新直接存储在目录中从而消除了“小文件问题”使持续流式写入数据湖变得切实可行。我们的基准测试显示与 Iceberg 相比查询速度快 926 倍数据写入速度快 105 倍。数据湖让用户能够避免被锁定在单一数据库中。它们通过将数据以开放格式最常见的是 Parquet存储来实现这一点。大多数数据湖如 Iceberg、Hudi 和 Delta也将其元数据即告诉您某个查询需要读取哪些文件的信息以 JSON 和 Avro 文件等开放格式存储。这意味着任何人都可以实现读取和写入这些格式的系统从而使用户免受单一商业解决方案的锁定。传统数据湖在存储数据时常常伴随着性能问题。问题的根源在于每次小规模写入都会创建一个新的数据文件并更新元数据。这导致存储中充斥着大量的小对象。在读取端查询现在需要遍历越来越多的元数据条目仅仅是为了弄清楚要扫描哪些文件。对于流式工作负载来说这些问题尤其痛苦因为它们会在长时间内执行大量小批量插入每次插入都会创建一个微小的 Parquet 文件和一些元数据文件。每秒一千次插入意味着成千上万这样的小文件不断累积导致性能下降。到了这一步您将被迫进行文件压缩这需要您安排和执行这些维护操作来维持数据湖的运行而维护作业执行时又会对性能造成更大的影响。DuckLake 颠覆了这一模式由于它使用数据库作为其目录它可以将小批量更新直接存储在目录中而不是立即将它们作为 Parquet 文件写入存储。我们将这种技术称为数据内联并将在本文中对其进行描述。示例流式传感器数据流式工作负载的典型例子是以固定间隔更新的传感器数据。作为一个实际例子考虑我们向数据湖插入 100 条观测数据的情况。[点击查看创建传感器数据表的示例脚本]frompyiceberg.catalogimportload_catalogfromdatetimeimportdatetimeimportpyarrowaspa catalogload_catalog(default,**{type:sql,uri:sqlite:///catalog.db,warehouse:file://warehouse,})catalog.create_namespace_if_not_exists(default)schemapa.schema([(sensor_id,pa.int32()),(temperature,pa.float64()),(ts,pa.timestamp(us)),])tablecatalog.create_table(default.readings,schemaschema)foriinrange(100):batchpa.table({sensor_id:pa.array([1],typepa.int32()),temperature:[21.5],ts:[datetime.now()],})table.append(batch)在传统数据湖中每次插入都会创建自己的 Parquet 文件以及相关的元数据文件。运行上面的示例会创建超过 300 个元数据文件200 个 Avro 文件和 101 个 JSON 文件以及 100 个 Parquet 文件。[点击查看 pyiceberg 脚本创建的目录结构]tree warehouse warehouse └── default └── readings ├── data │ ├── 00000-0-01a02dc3-deec-4be5-ab0f-5582e926419a.parquet │ ├── ... └── metadata ├── 00000-0a837115-bff0-4fd7-a3a0-51df4e0b5764.metadata.json ├── ... ├── 01a02dc3-deec-4be5-ab0f-5582e926419a-m0.avro ├── ... ├── snap-1086579672596758615-0-288b7b1d-f159-4692-9404-b2dba114fba2.avro └── ... 5 directories, 401 files如此多的文件使数据层和元数据层都变得臃肿对查询性能和存储账单产生巨大影响。这就是所谓的“小文件问题”。数据湖系统解决这个问题的方法是实施定期的压缩作业将小文件合并成大文件以减少 I/O 成本。但这些压缩例程并没有在写入时解决问题创建所有这些小文件的代价仍然存在并且在它们实际运行之前它们对查询性能没有帮助。DuckLake 采用了一种根本不同的方法。由于目录由用户选择的数据库管理DuckLake 可以将小批量更新、插入和删除直接存储在目录中而不是将它们写为文件。数据库系统几十年来一直专注于高效处理这类小规模读写因此它们天然适合这种工作负载。内联功能还旨在与数据湖的时间旅行特性完全集成。拿上面相同的传感器工作负载在 SQLite 作为目录数据库的情况下针对 DuckLake 运行。[点击查看将数据加载到 DuckLake 的 Python 脚本]importduckdb conduckdb.connect()con.execute(ATTACH ducklake:sqlite:sensors.ducklake AS lake (DATA_PATH sensor_data/))con.execute( CREATE TABLE lake.readings ( sensor_id INTEGER, temperature DOUBLE, ts TIMESTAMP ) )foriinrange(100):con.execute(fINSERT INTO lake.readings VALUES (1, 21.5, now()))# How many Parquet files were created?print(con.execute(SELECT count(*) FROM glob(sensor_data/*.parquet)).fetchone()[0])# 0 -- zero files, everything is inlined in the catalog插入 100 次后我们得到零个 Parquet 文件。所有数据都存在于目录中查询完全按预期工作。下图描绘了在我们的传感器工作负载下传统数据湖与 DuckLake 之间的区别。在 DuckLake 中数据存在于目录中并且在将其刷新到对象存储后只创建一个包含所有数据的 Parquet 文件。[Iceberg 与 DuckLake 在 100 次单行插入后的对比图。Iceberg 创建了 100 个 Parquet 文件和 100 个元数据快照。DuckLake 将所有数据内联存储在目录中产生零个 Parquet 文件并在刷新后将所有内容合并到一个 Parquet 文件中。]在本文的其余部分我们将对 DuckLake 在高竞争流式工作负载下启用和未启用内联功能进行基准测试比较并介绍内联功能在底层是如何工作的。流式基准测试为了了解流式处理在 DuckLake 中的影响我们设计了一个模拟自动驾驶汽车流式传感器数据的基准测试。该基准测试包含一个表其中有 23 个不同类型的列例如ts作为传感器时间戳speed_mps作为表示米/秒的浮点数。插入速率为每秒 100 行分 10 个批次进行每批 10 行。所有插入完成后我们对表列运行 9 个聚合查询例如avg(speed_mps)、stddev(speed_mps)、min(speed_mps)。然后我们执行一个检查点根据系统的不同这会触发压缩、刷新和清理步骤。所有写入操作都由单个duckdb进程执行。我们模拟了 50 分钟的数据包含 300,000 行和 30,000 个批次。目录数据库是 Amazon RDS PostgreSQL 16.10运行在 EC2 c7g.2xlarge 实例上数据存储在同一区域的 S3 存储桶中。步骤无内联有内联性能提升插入1,964 秒375.0 秒5.2 倍聚合查询1,574 秒1.7 秒925.9 倍检查点30 秒2.1 秒14.5 倍使用内联功能后插入速度大约快 5 倍。将数据存储到 PostgreSQL 的往返成本远低于为每个批次将 Parquet 文件写入 S3 的成本。最引人注目的结果是聚合查询性能926 倍的差异。在没有内联的情况下每个查询都必须打开 S3 上所有 30,000 个独立的 Parquet 文件。而在内联情况下数据存在于 PostgreSQL 中查询直接针对它执行完全避免了数千次远程文件读取。对于检查点未内联的情况必须将 30,000 个 Parquet 文件压缩成一个而内联的情况只是将数据从 PostgreSQL 目录刷新到 S3 上的一个 Parquet 文件性能提升了 14.5 倍。我们需要谈谈 Iceberg我们还使用 pyiceberg 和 Apache Polaris 对 Iceberg 运行了基准测试这是在生产环境中管理 Iceberg 表的常见设置。Iceberg 处理 50 分钟的流式工作负载耗时过长因此我们将其缩减到仅 100 秒10,000 行总共 1,000 个批次。步骤Iceberg (Polaris)启用内联的 DuckLake性能提升插入1,148.77 秒10.88 秒105 倍聚合查询83.06 秒0.09 秒923 倍检查点52.83 秒0.28 秒189 倍启用内联的 DuckLake 在所有指标上都快了两个数量级在聚合查询上更是快了近三个数量级。这种差距源于架构Iceberg 在客户端和 PostgreSQL 之间多了一次 REST 跳转并且其快照模型为每个批次写入大约四个 S3 文件而启用内联的 DuckLake 写入零个。这解释了巨大的性能差异。我们尽力为所有系统创建了现实的设置。通过架构和设计更改例如在客户端缓冲写入或插入更大的批次来缓解小文件问题是可能的但这会牺牲 ACID 保证并限制多用户支持这违背了流式写入数据湖的大部分初衷。DuckLake 易于设置欢迎您尝试一下运行自己的工作负载亲自体验其中的差异。内联的工作原理如果您好奇底层发生了什么本节将介绍其内部原理。当您插入、删除或更新的行数低于内联阈值默认为 10时DuckLake 会将更改存储在目录数据库中而不是写入 Parquet 文件。该阈值可以在全局、模式或表级别进行更改-- 全局更改所有表的默认值SETducklake_default_data_inlining_row_limit50;-- 按表为特定表覆盖设置ALTERTABLElake.readingsSET(data_inlining_row_limit100);-- 完全禁用内联SETducklake_default_data_inlining_row_limit0;在实践中这意味着您可以放心地将数据流式传输到 DuckLake而无需担心小文件的激增。DuckLake 通过目录中的插入表和删除表来管理内联数据这些表由规范中的内部表跟踪。在查询时DuckLake 会无缝地将内联数据与任何现有的 Parquet 文件结合起来因此无论数据存在于何处查询总是能返回正确的结果。下面我们介绍每个操作的工作原理。插入当插入的数据量低于内联阈值时DuckLake 不会创建 Parquet 文件。相反它会将行直接存储在目录数据库中的一个内联数据表中。该表包含原始列加上三个元数据列row_id– 该行的标识符begin_snapshot– 插入该行的快照end_snapshot– 删除该行的快照如果仍然存在则为 NULL快照列让 DuckLake 即使对内联数据也能保持完整的时间旅行支持。让我们来看一个具体的例子。首先我们设置一个 DuckLake 目录并创建一个表ATTACHducklake:sensors.ducklakeASlake(DATA_PATHsensor_data/);CREATETABLElake.readings(sensor_idINTEGER,temperatureDOUBLE,tsTIMESTAMP);现在我们插入几个小批次每个批次都低于默认的 10 行阈值INSERTINTOlake.readingsVALUES(1,21.5,2025-03-27 10:00:00);INSERTINTOlake.readingsVALUES(2,22.1,2025-03-27 10:00:10);INSERTINTOlake.readingsVALUES(1,21.8,2025-03-27 10:00:20);这些插入操作都没有创建 Parquet 文件。相反所有三行数据都存在于目录数据库中的一个名为ducklake_inlined_data_table-id_schema-version的内联数据表中。如果我们窥视目录内部ATTACHsensors.ducklakeAScatalog_db;SELECT*FROMcatalog_db.ducklake_inlined_data_1_1;┌────────┬────────────────┬──────────────┬───────────┬─────────────┬─────────────────────┐ │ row_id │ begin_snapshot │ end_snapshot │ sensor_id │ temperature │ ts │ │ int64 │ int64 │ int64 │ int32 │ double │ timestamp │ ├────────┼────────────────┼──────────────┼───────────┼─────────────┼─────────────────────┤ │ 0 │ 2 │ NULL │ 1 │ 21.5 │ 2025-03-27 10:00:00 │ │ 1 │ 3 │ NULL │ 2 │ 22.1 │ 2025-03-27 10:00:10 │ │ 2 │ 4 │ NULL │ 1 │ 21.8 │ 2025-03-27 10:00:20 │ └────────┴────────────────┴──────────────┴───────────┴─────────────┴─────────────────────┘每次插入都创建了一个新的快照但没有创建新文件。所有行的end_snapshot都是 NULL因为还没有行被删除。注意begin_snapshot从 2 开始因为CREATE TABLE语句本身占用了快照 1。如果删除操作的目标是仍然内联的行DuckLake 会通过设置该行的end_snapshot列来就地处理。不会创建删除文件。例如DELETEFROMlake.readingsWHEREsensor_id2;┌────────┬────────────────┬──────────────┬───────────┬─────────────┬─────────────────────┐ │ row_id │ begin_snapshot │ end_snapshot │ sensor_id │ temperature │ ts │ │ int64 │ int64 │ int64 │ int32 │ double │ timestamp │ ├────────┼────────────────┼──────────────┼───────────┼─────────────┼─────────────────────┤ │ 0 │ 2 │ NULL │ 1 │ 21.5 │ 2025-03-27 10:00:00 │ │ 1 │ 3 │ 5 │ 2 │ 22.1 │ 2025-03-27 10:00:10 │ │ 2 │ 4 │ NULL │ 1 │ 21.8 │ 2025-03-27 10:00:20 │ └────────┴────────────────┴──────────────┴───────────┴─────────────┴─────────────────────┘传感器 2 的行现在有了end_snapshot 5意味着它在快照 5 中被删除了。常规查询会将其过滤掉但时间旅行查询仍然可以看到它。删除删除内联处理的是另一种情况删除已经存在于 Parquet 文件中的行。DuckLake 不会重写 Parquet 文件或创建单独的删除文件而是在目录中的一个按表划分的内联删除表中记录删除操作。该表跟踪哪些 Parquet 文件中的哪些行已被删除以及导致删除的快照。例如假设我们有一个data.parquet文件其中包含一些我们想添加到表中的传感器读数CALLducklake_add_data_files(lake,readings,data.parquet);SELECT*FROMlake.readings;┌───────────┬─────────────┬─────────────────────┐ │ sensor_id │ temperature │ ts │ │ int32 │ double │ timestamp │ ├───────────┼─────────────┼─────────────────────┤ │ 1 │ 20.0 │ 2025-03-27 09:00:00 │ │ 2 │ 19.5 │ 2025-03-27 09:00:10 │ │ 3 │ 21.2 │ 2025-03-27 09:00:20 │ │ 4 │ 18.8 │ 2025-03-27 09:00:30 │ └───────────┴─────────────┴─────────────────────┘现在如果我们从这个文件中删除一行DuckLake 不会重写 Parquet 文件。相反它会在目录中创建一个名为ducklake_inlined_delete_table-id的内联删除表DELETEFROMlake.readingsWHEREsensor_id3;SELECT*FROMcatalog_db.ducklake_inlined_delete_1;┌─────────┬────────┬────────────────┐ │ file_id │ row_id │ begin_snapshot │ │ int64 │ int64 │ int64 │ ├─────────┼────────┼────────────────┤ │ 0 │ 2 │ 6 │ └─────────┴────────┴────────────────┘这个条目告诉 DuckLake文件 0 中的第 2 行在快照 6 中被删除了。在查询时DuckLake 会从 Parquet 文件扫描中过滤掉这一行因此它永远不会出现在结果中。更新更新操作就是一次删除后跟一次插入因此它们遵循上述完全相同的步骤并得到完全支持。刷新内联数据当然会随着时间的推移而增长因此 DuckLake 还提供了一个刷新操作将内联的行物化为合并后的 Parquet 文件。这在性能有要求或出于迁移目的时非常有用。-- 刷新目录中的所有内联数据CALLducklake_flush_inlined_data(lake);-- 仅刷新特定表CALLducklake_flush_inlined_data(lake,table_namereadings);或者刷新也是检查点例程的一部分该例程按顺序运行所有维护操作刷新、快照过期、文件合并和清理CHECKPOINTlake;结论“小文件问题”一直是数据湖处理流式工作负载的主要痛点之一。对于此类工作负载传统数据湖格式在写入时会产生小文件然后在后续的维护作业中进行清理。DuckLake 通过将小规模更改直接存储在目录中来完全避免这个问题而数据库系统几十年来一直在优化这种类型的工作负载。传统数据湖启用内联的 DuckLake小批量插入创建一个 Parquet 文件存储在目录中小批量删除创建一个删除文件存储在目录中1,000 次插入后的文件数1,000 个文件0 个文件需要压缩是定期进行否准备好时刷新即可查询性能随文件数量增加而下降不受小批量写入影响配置需要调优开箱即用内联功能开箱即用无需任何配置。插入、删除和更新都得到支持。当数据准备好存储为 Parquet 文件时只需一个检查点即可完成。数据内联功能将随 4 月份发布的 DuckLake 1.0 和 DuckDB v1.5.2 一起提供但您不必等待。您可以从 DuckDB v1.5.1 的core_nightly仓库安装 DuckLake。FORCEINSTALL ducklakeFROMcore_nightly;LOADducklake;然后您可以将其指向一个流式工作负载亲自体验其中的差异。运行您自己的基准测试感受它的魅力。设置只需五分钟运行无需任何配置。如果您遇到任何问题请在 GitHub 上提交 issue。如果您遇到特殊情况并希望进行讨论我们在 DuckDB Discord 频道上有一个活跃的社区。

相关文章:

DeepSeek总结的DuckLake 中的数据内联:为数据湖解锁流式处理

原文地址:https://ducklake.select/2026/04/02/data-inlining-in-ducklake/ DuckLake 中的数据内联:为数据湖解锁流式处理 Pedro Holanda 2026-04-02 TL;DR: DuckLake 的数据内联功能将小批量更新直接存储在目录中,从而消除了“小…...

2026-04-03期 AI最新资讯

2026年4月3日 AI资讯日报 每日精选人工智能领域最新动态,带你快速掌握技术突破、产品发布与行业趋势。🚀 技术突破 Meta 发布 Llama 4 系列开源大模型 Meta 今日正式推出 Llama 4 系列,包含三个版本:Llama 4 Mini、Llama 4 Base 和…...

多源数据驱动的农害预测模型

基于多源数据与集成学习的农作物病虫害预测及防控优化模型 标签:农业AI 机器学习 XGBoost LSTM Stacking SHAP 遗传算法 风险建模 一、整体技术路线概览 我们构建了一个五层递进式智能决策系统,从原始数据到最终可解释的防控建议,层层…...

OpenClaw安全实践:Qwen3.5-9B本地化部署防数据泄露方案

OpenClaw安全实践:Qwen3.5-9B本地化部署防数据泄露方案 1. 为什么需要关注OpenClaw的安全问题? 去年冬天,我在整理公司财报时突然意识到一个问题:如果让AI助手帮我处理这些敏感文件,数据会不会被意外上传到云端&…...

OpenClaw对话增强:Kimi-VL-A3B-Thinking多轮图文交互设计模式

OpenClaw对话增强:Kimi-VL-A3B-Thinking多轮图文交互设计模式 1. 为什么需要优化复杂任务的人机交互 上周我尝试用OpenClaw处理一个看似简单的需求:根据一组产品图片和参数表格,生成一份包含优缺点分析的评测报告。本以为这只是"输入-…...

嵌入式通信协议:UART、SPI、I2C原理与应用

1. 嵌入式通信协议基础概述在嵌入式系统开发中,各种通信协议就像设备之间的"语言",决定了数据如何在不同模块间传递。作为一名嵌入式工程师,我经常需要在项目中根据具体需求选择合适的通信方式。UART、SPI、I2C这三种串行通信协议可…...

用VNA实测滤波器群时延:手把手教你避开IQ信号失真的坑(附校准技巧)

射频滤波器群时延实战:VNA测量技巧与IQ信号保真解决方案 在无线通信系统设计中,滤波器的群时延特性往往是被忽视的关键参数。许多工程师在评估滤波器性能时,主要关注插入损耗、带外抑制等传统指标,却忽略了群时延波动可能导致的信…...

程序实现多参数联动判断,单一参数异常不报警,多参数契合才报警,零误报。

一、实际应用场景描述某高校《智能仪器》综合实验项目中,有一套电机运行状态监测系统:- 监测参数:- 电流(A)- 振动(mm/s)- 温度(℃)现场现象:- 电机启动时&am…...

OpenClaw+千问3.5-9B:个人知识库的自动构建与更新

OpenClaw千问3.5-9B:个人知识库的自动构建与更新 1. 为什么需要自动化知识管理 作为一个长期与技术文档打交道的开发者,我发现自己面临一个典型困境:每天接触大量有价值的信息——技术博客、论文片段、代码示例、会议记录——但它们最终都散…...

低成本个人知识库:OpenClaw+Qwen3-32B构建自动化归档系统

低成本个人知识库:OpenClawQwen3-32B构建自动化归档系统 1. 为什么需要个人知识库自动化 作为一个长期与技术文档打交道的开发者,我发现自己陷入了一个怪圈:每天收集大量有价值的网页、论文和代码片段,但它们最终都散落在浏览器…...

【OpenClaw全面解析:从零到精通】第032篇:OpenClaw v2026.4.1 深度解析:聊天原生任务板、SearXNG 搜索与安全护栏如何重塑 AI Agent 工作流

上一篇:[第031篇] OpenClaw 会话管理与上下文持久化深度解析:从“失忆”到长期记忆的完整解决方案 下一篇:未完待续 OpenClaw v2026.4.1 不是一个“加几个小功能”的普通补丁版,而是对 v2026.3.31 安全收紧与后台任务重构的一次前…...

差分放大电路实战:从热电偶信号处理到医疗设备应用

差分放大电路实战:从热电偶信号处理到医疗设备应用 在工业测量和医疗电子领域,微弱信号的精确采集始终是工程师面临的挑战。想象一下:当热电偶输出的50μV温差信号淹没在2V的工频干扰中,或者心电图电极捕捉到的1mV心电信号与10V的…...

避坑指南:从聚宽迁移到QMT必须知道的5个细节(含Redis连接异常处理)

从聚宽迁移到QMT的实战避坑指南:Redis连接与xtquant重连机制详解 当量化团队需要从聚宽平台迁移到QMT时,往往会遇到一系列技术细节上的挑战。本文将聚焦五个最容易被忽视但至关重要的技术环节,特别是Redis连接池管理和xtquant重连机制这两个直…...

B0505S-2WR3 适配优选 DB2-05S05LS,DC-DC 电源模块参数与场景深度解析

在工业控制、仪器仪表、通信接口等标准化电路设计中,2W 级 5V 转 5V 隔离 DC-DC 模块是高频应用的核心器件。DB2-05S05LS 和 B0505S-2WR3 作为该功率段的主流型号,在电气规格、物理规格与场景适配性上呈现高度契合,为硬件工程师的标准化选型提…...

基于TuGraph的医疗知识图谱构建与智能问答实践

1. 医疗知识图谱构建全流程解析 医疗知识图谱作为医疗信息化的重要基础设施,正在深刻改变着医疗数据的组织方式和应用模式。不同于传统的关系型数据库,图数据库能够更直观地展现疾病、症状、药物等实体间的复杂关系。我们以TuGraph图数据库为例&#xff…...

优艾智合冲刺港股:年营收3.4亿亏3.8亿 蓝驰与真格是股东

雷递网 雷建平 4月3日合肥优艾智合机器人股份有限公司(简称:“优艾智合”)日前更新招股书,准备在港交所上市。年营收3.4亿 亏损3.8亿优艾智合是一家工业具身智能科技公司,为半导体、能源化工、锂电、3C及其他制造、公用…...

机器学习04——numpy

1、numpy介绍Numpy(Numerical Python)是一个开源的Python科学计算库,用于快速处理任意维度的数组。Numpy支持常见的数组和矩阵操作。对于同样的数值计算任务,使用Numpy比直接使用Python要简洁的多。Numpy使用ndarray对象来处理多维…...

天华新能冲刺港股:年营收75亿净利降56% 宁德时代是二股东 裴振华夫妻套现26亿

雷递网 雷建平 4月3日苏州天华新能源科技股份有限公司(简称:“天华新能”)日前递交招股书,准备在港交所上市。天华新能2014年在深交所上市,截至今日午盘,天华新能股价为58.6元,市值为487亿元。一…...

从顺序图反推代码:如何设计一个高内聚低耦合的网上书城后端服务?

从顺序图到高内聚低耦合架构:网上书城后端设计实战 当我们在白板上画完一张精美的顺序图时,真正的挑战才刚刚开始——如何将这些交互箭头转化为可维护、易扩展的代码结构?我曾参与过一个日均订单量超过5万单的图书电商平台重构,深…...

量子密码 vs 后量子密码:企业安全负责人必须知道的5个关键差异

量子密码与后量子密码:企业安全决策者的技术选型指南 当金融巨头J银行遭遇一次未遂的数据窃取时,安全团队发现攻击者已开始收集加密流量——这是典型的"现在窃取,未来解密"战术。企业安全负责人面临的现实困境是:面对量…...

TEST文件夹:Pytest,集成测试,单元测试

在复杂的自动驾驶项目中,哪怕你只改了一行代码,都可能导致整个感知或控制系统崩溃。如果直接去训练,还会消耗大量算力。所以当你新写了一个功能(比如你改了采样逻辑),先不要急着去跑训练。先跑一下测试&…...

告别setData地狱!用miniprogram-computed给你的微信小程序组件加上计算属性

告别setData地狱!用miniprogram-computed给你的微信小程序组件加上计算属性 每次在小程序里处理复杂数据联动时,你是不是也经历过这样的痛苦?表单验证状态需要根据三个输入框内容实时更新,购物车总价要随着商品数量和优惠券动态计…...

避坑指南:CentOS7安装JDK17常见问题及解决方案

CentOS7实战:JDK17安装全流程与疑难问题深度解析 在Linux服务器环境中,Java开发工具包(JDK)的安装配置是开发者必须掌握的基础技能。随着Java 17作为最新的长期支持(LTS)版本逐渐成为企业级应用的新标准&am…...

周红伟引爆AI“小龙虾”狂潮:80%家长焦虑的职场,正被OpenClaw重塑?

周鸿祎预言:"不用智能体的人,终将被会用智能体的人淘汰。"内容由AI智能生成从极客玩具到企业标配的加速跑OpenClaw的爆火并非偶然。这款开源AI智能体最大的价值在于改变了人们对智能体的认知——它不再是一个只会聊天的工具,而是能…...

2026 前端面试必杀技:全新版|不重复、大白话、直接背

2026 前端面试必杀技:全新版|不重复、大白话、直接背一、2026 面试新趋势(先搞懂,少走弯路) 不再死背八股,原理 场景 方案才是高分答案AI 工作流、全栈、性能、安全四大新重点必考框架问得更细&#xff1…...

OpenClaw极简配置法:千问3.5-35B-A3B-FP8快速接入指南

OpenClaw极简配置法:千问3.5-35B-A3B-FP8快速接入指南 1. 为什么选择极简配置法 上周我在测试OpenClaw对接本地大模型时,被冗长的onboard向导折磨得够呛——光是模型选择、渠道配置、技能安装就花了半小时。直到发现直接修改openclaw.json的baseUrl字段…...

Arduino嵌入式单元测试框架:ArduinoUnit实战指南

1. Arduino平台嵌入式单元测试框架深度解析:unittest库工程实践指南在嵌入式固件开发中,"写完就烧、烧完就测、测完就改"的野蛮生长模式正迅速被工程化开发流程所取代。尤其在ESP32等资源受限但功能复杂的SoC平台上,缺乏可重复、可…...

Vue3 + Element Plus项目实战:如何封装一个带比例锁定和实时预览的智能图片裁剪上传组件?

Vue3 Element Plus实战:构建智能图片裁剪上传组件的工程化实践 在当今的Web应用中,图片上传几乎是每个系统的标配功能。但简单的文件选择器往往无法满足专业需求——设计师需要精确控制图片比例,产品经理要求实时预览效果,而开发…...

基于S7-200控制的自动洗车系统的综合设计与实现

基于S7-200控制的自动洗车系统 本设计包括设计报告,PLC组态仿真,I/O接口,带注释程序pdf版,接线图,控制电路图,主电路图,PLC接线图,顺序功能图 总体设计 系统有自动和手动模式,选择手…...

VL53L1X_mbed驱动开发:嵌入式ToF测距实战指南

1. VL53L1X_mbed 库深度解析:面向嵌入式工程师的ToF激光测距驱动开发指南VL53L1X 是 STMicroelectronics 推出的第二代飞行时间(Time-of-Flight, ToF)激光测距传感器,采用 940nm 不可见红外 VCSEL 光源与单光子雪崩二极管&#xf…...