C++ 对接 S3 对象存储实战:SDK 选型、分片上传与避坑指南
1. 为什么我要花时间梳理这套 C S3 SDK 使用流程做后端存储开发的朋友大概率都碰过对象存储对接这件事。不管是做私有化部署的存储网关还是给业务系统加一个文件上传下载的能力S3 协议几乎是绕不开的事实标准。而 C 这门语言在存储、音视频、边缘计算这些领域又是主力所以“用 C 对接 S3”这个需求远比很多人想象中要普遍。但真正上手之后你会发现一个尴尬的现实S3 的官方文档基本是围绕 REST API 和几种主流脚本语言展开的C 这块的资料零散得可怜。要么是某个开源库的 README 写得语焉不详要么是网上搜到的示例代码跑不起来要么是编译链接阶段就卡死一大片人。我自己前前后后在三四个项目里对接过不同的 S3 兼容存储踩过的坑足够写一本小册子所以这次干脆把整套流程从头到尾梳理一遍。这篇内容适合几类人一是第一次在 C 项目里接入对象存储、不知道从哪下手的开发者二是已经能跑通基本功能、但在分片上传、断点续传、异常处理这些环节反复翻车的同学三是需要做技术选型、想搞清楚不同 SDK 方案优劣的架构同学。我会把选型逻辑、环境搭建、核心 API 用法、分片上传的完整实现、常见报错排查这几块讲透代码尽量给到能直接抄的程度。需要先说明一点S3 本身是一套协议规范市面上有多个兼容实现本文讨论的是通用的 S3 协议对接思路具体到某个存储服务时个别行为可能有差异我会在涉及的地方标注出来。另外文中涉及的库名、版本号都以我实际用过的为准你选型时可以根据自己的项目情况调整。2. C 对接 S3 的方案选型与整体思路2.1 三种主流技术路线对比在 C 里对接 S3本质上就三条路直接用官方或社区维护的 C SDK、自己基于 HTTP 库手撸 S3 协议、走命令行工具做进程调用。这三条路我都走过各有各的适用场景先把结论摆出来。方案代表实现上手难度功能完整度维护成本适用场景成熟 C SDK某开源 C SDK中高低生产环境、功能需求全手撸 HTTP 协议基于 libcurl 等高取决于投入高需求极简、想完全可控命令行工具调用调用外部可执行程序低中中脚本化、临时任务成熟 SDK 的优势在于它把签名计算、分片逻辑、重试机制、连接池这些脏活累活都封装好了。S3 的请求签名尤其是 V4 签名是个相当容易出错的环节自己实现的话光是 canonical request 的拼接规则就能让你调一整天。所以除非你的需求真的简单到只有“上传一个文件”这一种操作否则我强烈建议用成熟 SDK。手撸协议这条路我只在一种情况下推荐你的目标存储服务对 S3 协议做了大量私有扩展或者你需要对每个 HTTP 请求做极细粒度的控制比如自定义的流量整形。这种情况下 SDK 反而会成为束缚。但要做好心理准备签名、分片、错误重试这些你都得自己扛。命令行工具调用是最省事的适合做运维脚本或者一次性任务。但它的致命伤是进程开销大、错误处理粗糙、无法做流式处理放到高并发的服务里基本不可用。2.2 为什么最终选择 SDK 路线我现在的项目是一个边缘侧的媒体处理服务需要频繁地把处理好的切片上传到对象存储同时要支持大文件的分片上传和失败重传。这个场景对 SDK 的依赖很重分片上传的 part 管理、ETag 校验、并发控制这些如果自己实现工作量至少翻三倍而且稳定性很难保证。选 SDK 的时候我重点看了几个维度。第一是签名版本支持现在主流存储基本都要求 V4 签名老库如果只支持 V2 会直接连不上。第二是分片上传的 API 是否完整有些库只给了简单的 put_object分片要自己拼那就失去意义了。第三是依赖是否干净有些 SDK 拖家带口引入一堆第三方库在交叉编译环境下简直是灾难。第四是异常处理机制网络抖动、超时、限流这些情况必须有清晰的重试和错误码。综合下来我用的这套 SDK 在这几个维度上都比较均衡。它的接口设计偏底层不像某些封装过度的库那样把什么都藏起来这对需要精细控制的场景反而是好事。下面所有的实操都基于这套思路展开你换成其他同类 SDK 时核心逻辑是相通的。2.3 整体架构分层在动手写代码之前先把整个对接流程在脑子里分个层这样后面遇到问题能快速定位是哪一层出了岔子。最底层是网络传输层负责 HTTP 连接的建立、复用、超时控制。这一层通常由 SDK 内部的 HTTP 客户端处理但你可以通过配置项影响它的行为比如连接超时、最大重试次数、是否复用连接。往上是协议层负责 S3 请求的构造和响应的解析包括签名计算、XML 解析、错误码映射。这一层是 SDK 的核心也是你调 API 时直接打交道的部分。再往上是业务封装层这一层是你自己写的。比如把“上传一个本地文件”封装成一个函数内部根据文件大小自动决定用简单上传还是分片上传处理重试和进度回调。这一层的设计质量直接决定了你整个项目的可维护性。最上面是应用层就是你的业务逻辑调用封装好的接口。理想情况下业务层不应该感知到 S3 的存在它只知道“我要存一个东西”和“我要取一个东西”。3. 环境搭建与 SDK 集成实操3.1 依赖准备与编译选项集成 SDK 的第一步永远是搞定依赖。这类 C SDK 通常依赖几个基础库用于网络传输的 HTTP 库、用于加密签名的算法库、用于 XML 解析的解析库。在 Linux 环境下这些大多能通过包管理器装到但要注意版本匹配。我习惯的做法是先看 SDK 的构建脚本里对依赖版本的要求然后逐个确认系统里装的版本是否满足。曾经遇到过一次诡异的问题编译能过但运行到签名环节就崩溃查了半天发现是加密库版本太老某个哈希函数的接口签名变了。所以版本这件事不能偷懒。编译选项上有几个关键点。如果你的项目是 Release 构建记得把 SDK 也用 Release 编混用 Debug 和 Release 在 Windows 上会直接链接失败在 Linux 上则可能出现难以排查的内存问题。另外如果要做交叉编译SDK 的 CMake 脚本里通常有开关可以关掉测试和示例的编译能省不少时间。# 典型的构建流程具体参数以你用的 SDK 为准 mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease \ -DBUILD_SHARED_LIBSON \ -DENABLE_TESTINGOFF make -j$(nproc) make install提示如果目标环境不允许安装到系统目录用-DCMAKE_INSTALL_PREFIX指定一个自定义路径然后在你的项目里通过CMAKE_PREFIX_PATH指向它避免污染系统环境。3.2 项目集成与链接配置SDK 装好之后在你的项目里集成有两种方式一种是直接链接安装好的库另一种是把 SDK 源码作为子模块引入一起编译。前者适合 SDK 版本稳定的情况后者适合你需要改 SDK 源码或者锁定特定提交的场景。链接的时候最容易出问题的是传递依赖。SDK 依赖的那些库你的项目也得能链接到。用 CMake 的话如果 SDK 提供了 config 文件直接find_package就能自动带上依赖。如果没有你就得手动把每个依赖库都加到target_link_libraries里。find_package(YourS3SDK REQUIRED) target_link_libraries(your_target PRIVATE YourS3SDK::YourS3SDK) # 如果 SDK 没提供 config 文件手动指定 target_include_directories(your_target PRIVATE /path/to/sdk/include) target_link_libraries(your_target PRIVATE /path/to/sdk/lib/libs3sdk.a curl crypto ssl )我踩过的一个坑是静态链接顺序。Linux 下链接器对静态库的顺序敏感被依赖的库要放在依赖它的库后面。如果报一堆 undefined reference先检查链接顺序八成是这个问题。3.3 初始化配置与凭证管理SDK 初始化阶段要配置的东西主要有几类访问凭证、服务端点、区域信息、超时和重试策略。凭证这块我要多说两句因为这是安全重灾区。绝对不要把 access key 和 secret key 硬编码在源码里。我见过太多项目这么干一旦代码泄露存储桶就等于对全世界开放了。正确的做法是从环境变量、配置文件或者专门的密钥管理服务里读取。如果一定要写配置文件确保文件权限收紧并且不要提交到版本控制。// 从环境变量读取凭证的典型做法 const char* access_key std::getenv(S3_ACCESS_KEY); const char* secret_key std::getenv(S3_SECRET_KEY); if (!access_key || !secret_key) { throw std::runtime_error(missing credentials in environment); } Aws::Auth::AWSCredentials creds(access_key, secret_key); Aws::Client::ClientConfiguration config; config.endpointOverride https://your-endpoint.example.com; config.region your-region; config.connectTimeoutMs 5000; config.requestTimeoutMs 30000; config.maxConnections 25; config.retryStrategy std::make_sharedAws::Client::DefaultRetryStrategy(3);区域信息这个字段很多人会忽略但它在签名计算里是参与运算的。如果区域填错签名就会不匹配服务端返回 403。有些兼容存储对区域不敏感填什么都行但为了通用性还是按实际值填。超时配置要根据你的网络环境调。内网环境可以设短一点比如连接超时 2 秒、请求超时 10 秒跨公网的话适当放宽。最大连接数决定了并发能力设太小会成为瓶颈设太大又可能把服务端打爆一般 20 到 50 之间比较稳妥。4. 核心 API 使用与分片上传完整实现4.1 基础操作上传、下载、列举、删除先把最基础的四个操作过一遍这几个是所有上层功能的地基。上传小文件用 put_object 就够了。它的逻辑是把整个文件读进内存或者流式读取然后一次性发出去。这里有个细节Content-Length 必须准确如果用的是流式读取又没法预先知道长度就得用分片上传或者 chunked 编码。很多新手在这里翻车传上去的文件总是少几个字节或者多几个字节基本都是长度没算对。Aws::S3::Model::PutObjectRequest request; request.SetBucket(bucket); request.SetKey(key); auto input Aws::MakeSharedAws::FStream(tag, local_path, std::ios_base::in | std::ios_base::binary); request.SetBody(input); auto outcome client.PutObject(request); if (!outcome.IsSuccess()) { // 错误处理见 4.4 节 }下载用 get_object返回的是一个流对象你可以边读边写文件也可以一次性读完。大文件强烈建议流式处理否则内存直接爆掉。列举用 list_objects_v2注意它一次最多返回 1000 个对象超过的部分要靠 continuation token 翻页这个翻页逻辑一定要写对否则会漏对象。删除用 delete_object单个删除很简单。批量删除用 delete_objects一次最多 1000 个 key。这里有个坑批量删除即使部分失败HTTP 状态码也可能是 200真正的失败信息在响应体的 Deleted 和 Error 列表里必须解析响应体才能知道哪些没删掉。4.2 分片上传的完整流程拆解分片上传是这套 SDK 里最复杂也最有价值的部分大文件上传、断点续传、并发加速全靠它。整个流程分五步初始化分片上传、逐个上传分片、记录每个分片的 ETag、完成分片上传、异常时中止上传。初始化的时候SDK 会返回一个 upload id这个 id 是后续所有操作的凭证必须保存好。如果程序在中途崩溃这个 id 丢了那已经上传的分片就成了孤儿数据虽然存储端通常有生命周期规则会清理但在清理之前是会占空间的。分片大小的选择是个技术活。S3 协议要求每个分片最小 5MB最后一片除外最大 5GB最多 10000 片。这意味着单个文件最大支持 5TB。实际选择时我一般按文件大小动态决定小于 100MB 的文件用 8MB 分片100MB 到 1GB 用 16MB超过 1GB 用 32MB 或更大。分片太小会导致请求数暴增签名和网络开销占比过高分片太大则单个分片失败重传的代价高而且并发度上不去。// 根据文件大小动态计算分片大小 size_t CalculatePartSize(uint64_t file_size) { const size_t MB 1024 * 1024; if (file_size 100 * MB) return 8 * MB; if (file_size 1024 * MB) return 16 * MB; return 32 * MB; }上传分片的时候每个分片要带上 part number从 1 开始连续编号。SDK 上传成功后会返回该分片的 ETag这个值必须记录下来完成上传时要按顺序提交。ETag 的格式通常是带引号的十六进制字符串提交时要不要带引号取决于具体实现这个细节一定要对着文档确认我见过因为引号问题导致 complete 失败的案例。并发上传是提升大文件速度的关键。你可以用线程池同时上传多个分片但要注意两点一是并发数不要超过 SDK 的最大连接数配置否则请求会排队二是要控制内存占用每个分片在内存里都有一份缓冲并发数乘以分片大小就是峰值内存。我一般把并发数控制在 4 到 8 之间。4.3 断点续传的实现思路断点续传的核心是把 upload id 和已上传分片的列表持久化下来下次启动时先查询服务端已有哪些分片然后只上传缺失的部分。查询已上传分片用 list_parts 接口它会返回每个分片的 part number、ETag 和大小。拿到这个列表后和你本地记录的一对比就知道哪些还需要传。这里有个细节如果某个分片传了一半失败了服务端可能没有记录也可能记录了一个不完整的所以最稳妥的做法是以服务端返回的列表为准本地记录只作为参考。持久化的位置我一般选本地的一个小文件格式用 JSON 就行记录 upload id、文件路径、文件大小、分片大小、已完成分片列表。每次分片上传成功后更新这个文件。注意写文件要原子操作先写临时文件再 rename避免程序崩溃时文件损坏。struct UploadCheckpoint { std::string upload_id; std::string file_path; uint64_t file_size; size_t part_size; std::vectorCompletedPart completed_parts; // 序列化和反序列化方法略 };注意断点续传的 checkpoint 文件要和具体的存储桶、对象 key 绑定。如果同一个文件要传到不同的桶checkpoint 不能混用否则 upload id 对不上complete 会失败。4.4 错误处理与重试机制S3 操作的错误分几类处理方式完全不同。第一类是客户端错误比如 400 参数错误、403 权限不足、404 对象不存在。这类错误重试没用必须修正请求本身。403 尤其常见可能是凭证过期、签名错误、或者桶策略不允许。排查 403 的时候先确认凭证是否有效再确认签名版本和区域是否匹配最后看桶策略。第二类是服务端错误5xx 系列。这类错误通常是暂时的重试有意义。SDK 一般内置了重试策略但默认次数可能不够可以调大。重试的时候要注意退避策略不要固定间隔猛冲用指数退避加随机抖动比较稳妥。第三类是网络错误超时、连接重置这些。这类错误同样适合重试但要区分是连接阶段失败还是传输阶段失败。传输阶段失败的话分片上传的某个分片重传即可不用整个重来。bool ShouldRetry(const Aws::S3::S3Error error) { auto type error.GetResponseCode(); if (type Aws::Http::HttpResponseCode::REQUEST_TIMEOUT) return true; if (type Aws::Http::HttpResponseCode::TOO_MANY_REQUESTS) return true; if (static_castint(type) 500) return true; return false; }限流错误429 或特定的错误码要特别对待。遇到限流不能硬重试要退避而且最好降低并发数。我遇到过并发设太高被服务端限流结果所有请求都在重试反而更慢的情况。后来把并发降到 4反而稳定跑满了带宽。5. 常见问题排查与避坑经验实录5.1 签名相关报错速查签名问题是 S3 对接里最高频的报错来源我把常见的几种整理成表。报错信息关键词可能原因排查方向SignatureDoesNotMatch签名计算错误检查 secret key、区域、签名版本InvalidAccessKeyId凭证无效确认 access key 是否正确、是否过期RequestTimeTooSkewed客户端时间偏差过大校准系统时间误差控制在 15 分钟内AuthorizationHeaderMalformed区域不匹配确认配置的 region 和桶所在区域一致时间偏差这个坑特别隐蔽。有一次在容器环境里跑宿主机时间是对的但容器时间慢了半小时所有请求全部签名失败。排查了半天才想到看容器时间。所以部署的时候一定要确保时间同步服务正常工作。签名版本也要注意。老版本 SDK 默认用 V2 签名新存储基本都要求 V4。如果你的 SDK 支持配置显式指定 V4避免踩坑。5.2 分片上传典型故障分片上传最常见的故障是 complete 失败报 EntityTooSmall 或者 InvalidPart。EntityTooSmall 是说某个分片小于 5MB。这通常发生在最后一片之外的分片计算错误比如文件大小除以分片大小没除尽导致中间某片偏小。解决方法是确保除了最后一片其他分片都严格等于设定的分片大小。InvalidPart 是说提交的分片 ETag 和 part number 对不上。原因可能是 ETag 记录时多了或少了引号或者 part number 顺序错了或者中间有分片没传成功但被记录成了成功。排查的时候把本地记录的列表和服务端 list_parts 的结果逐项对比很快就能定位。还有一个坑是 upload id 过期。有些存储对未完成的分片上传有生命周期限制比如 7 天不完成就自动清理。如果你的断点续传跨越了这个时间upload id 就失效了这时候只能重新开始。所以 checkpoint 文件里最好记录创建时间超过一定时长就主动放弃重来。5.3 性能调优的几个关键参数性能这块我实测下来影响最大的三个参数是分片大小、并发数、连接复用。分片大小前面说过了按文件大小动态调整。并发数不是越大越好要结合带宽和内存综合看。一个简单的估算方法假设你的上行带宽是 B Mbps单个分片大小是 S MB那么理论上并发数 N 满足 N * S * 8 / B 接近单个分片的传输时间时比较合理。实际调的时候从 4 开始往上试观察带宽利用率和错误率。连接复用能显著降低延迟尤其是小文件多的场景。确保 SDK 的 HTTP 客户端开启了 keep-alive并且最大连接数足够。如果每次请求都新建连接TLS 握手的时间可能比传输本身还长。另外如果存储端支持开启传输加速或者用就近的接入点对跨地域访问的提升非常明显。这个要看具体存储服务的能力配置方式也各不相同。5.4 内存与资源管理注意事项C 里做网络编程资源管理是永恒的话题。SDK 返回的流对象、响应对象都要确保正确释放。用智能指针管理生命周期避免裸指针到处传。大文件上传时不要一次性把整个文件读进内存。用流式读取每次只读一个分片的大小。我见过有项目为了图省事把 2GB 的文件整个读进 vector 再分片结果内存直接爆掉。线程安全也要注意。SDK 的客户端对象通常是线程安全的可以多线程共享但请求对象和响应对象不是每个线程要用自己的。如果拿不准就每个线程创建一个客户端虽然会多占点资源但省心。还有一个容易忽略的点是异常安全。分片上传过程中如果抛异常要确保已经初始化的 upload 被中止掉否则会留下孤儿分片。用 RAII 封装一个 guard 对象析构时自动 abort是个好习惯。class MultipartUploadGuard { public: MultipartUploadGuard(S3Client client, const std::string bucket, const std::string key, const std::string upload_id) : client_(client), bucket_(bucket), key_(key), upload_id_(upload_id), completed_(false) {} ~MultipartUploadGuard() { if (!completed_) { // 析构时如果还没完成中止上传 AbortMultipartUpload(); } } void MarkCompleted() { completed_ true; } private: // 成员略 };这套流程我在几个项目里反复打磨过从最开始的手忙脚乱到现在的稳定运行中间踩的坑基本都记录在上面了。对象存储对接这件事说难不难说简单也不简单关键是把分片上传和错误处理这两块吃透剩下的都是体力活。如果你在实操中遇到上面没覆盖到的问题大概率是具体存储服务的实现差异对着它的文档确认一下协议细节基本都能解决。

相关新闻

SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

SQLite安装全指南:嵌入式数据库跨平台配置与常见坑

第一次折腾SQLite的时候,我找了一圈“Setup.exe”,愣是没找到。下载页面全是压缩包,网上一堆教程各写各的,有人说不用装,有人说得编译源码,看得人发懵。后来我才搞明白:SQLite的“安装”逻辑跟M…

2026/10/14 3:04:31 阅读更多 →
C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

C++手写数据结构实战:动态数组、哈希表、AVL树与图算法

简介:《Implementing Useful Algorithms in C》由Dmytro Kedyk撰写,面向具备一定C基础、希望深入掌握算法设计与工程实现的开发者与计算机专业学生。全书从算法正确性证明、渐进记法与机器模型等基本原则切入,系统讲解数据类型选择、内存管理…

2026/10/14 3:04:31 阅读更多 →
本地27B模型配Function Calling:工具不触发的原因与实战

本地27B模型配Function Calling:工具不触发的原因与实战

给本地跑的27B模型配了三个专业工具之后,我做的第一件事就是拿它试聊天。你猜怎么着——工具列表明明挂在接口定义里,模型却像一个看见工具箱、却只肯用手拧瓶盖的人,简单问题全凭语言能力直接答,一个工具都不碰。我一度觉得这套配…

2026/10/14 3:04:31 阅读更多 →

最新新闻

一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

一张图微调YOLOv11:自然栖息地鸟类检测的流程与扩充

简介:面向 YOLOv11 模型验证需求,这份精简版鸟类目标检测数据集包含一张真实野外鸟类图像及配套标准标注,可用于快速原型验证、轻量级部署测试与小样本检测基线建立。压缩包共五个文件,包含三张 JPG 图像、一个数据配置文件与一个…

2026/10/14 3:39:38 阅读更多 →
ASP.NET + SQLServer葡萄酒商城源码:从数据库还原到下单事务全攻略

ASP.NET + SQLServer葡萄酒商城源码:从数据库还原到下单事务全攻略

简介:一套基于ASP.NET与SQL Server的葡萄酒网上商城销售系统,面向ASP.NET WebForm学习者、毕业设计学生以及需要搭建在线商城教学演示的开发者。系统围绕普通会员、商户会员和管理员三类角色展开,覆盖商品管理、购物车、订单处理、发货、商户…

2026/10/14 3:39:38 阅读更多 →
LangChain项目代码拆解:Chain、Agent、Memory与Retrieval四大核心组件实战指南

LangChain项目代码拆解:Chain、Agent、Memory与Retrieval四大核心组件实战指南

简介:这是一份LangChain入门与实践的项目代码包,面向正在学习大模型应用开发的Python开发者,旨在帮助读者快速理解LangChain的模块化设计与核心用法。包内共3个文件,包含一个HTML格式的入门讲解页、一个项目运行配置文件以及一个版…

2026/10/14 3:39:38 阅读更多 →
C++学习日记 Day21:C++11(下)lambda表达式和function包装器

C++学习日记 Day21:C++11(下)lambda表达式和function包装器

## 今天学了什么今天学习C11的lambda表达式和function包装器。## 可调用对象概念:在C中有一类对象可像函数一样调用;分类:①函数指针using prt void(*)(int, string); prt f1 fun; f1(1, "函数指针");②仿函数 --有 operator&am…

2026/10/14 3:39:38 阅读更多 →
一人公司AI工作流:6步实现内容生产去体力化

一人公司AI工作流:6步实现内容生产去体力化

1. 一人公司的内容困局与破局思路一个人做内容,最怕的不是没灵感,而是灵感来了却卡在“执行”上。写一篇长文要三小时,做一张配图要半小时,剪一条短视频要一整个下午,排版发布又要来回切换四五个平台。一天下来&#x…

2026/10/14 3:39:38 阅读更多 →
8765平台前后摄DVDD电压不一致排查与修复指南

8765平台前后摄DVDD电压不一致排查与修复指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 3:38:38 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →