尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
React Native开发OpenHarmony应用:大文件上传断点续传实践
最近在搞一个基于OpenHarmony的跨平台应用业务方要求实现大文件上传功能而且明确点名要“断点续传”。之所以用到React Native是因为团队里前端工程师居多Native层只有一个人维护如果纯用ArkTS写全套业务排期根本兜不住。这个项目折腾下来我最大的感受是React Native跑在OpenHarmony上并没有想象中那么“原汁原味”但核心的桥接思路是一致的真正难的不是RN本身而是文件分片、续传状态管理、以及跟底层文件系统的配合这些基本功。这篇就围绕“用React Native开发OpenHarmony应用File文件上传断点续传”这个标题把我在项目里踩过的坑、验证过的方案、以及可以直接抄的代码逻辑完整写一遍。不管你是刚接触RNOpenHarmony的新手还是已经在做跨平台文件上传的老手只要碰到过“传一半断了、又得重头传”这种破事这篇应该能给你省下不少时间。1. 项目背景与断点续传需求拆解1.1 为什么在OpenHarmony上选择React Native先说背景。这个应用的目标设备是搭载OpenHarmony的平板和一体机需要同时覆盖手机端。如果分两套原生开发Android一套、OpenHarmony一套工作量直接翻倍。而React Native本身支持Android和iOS社区又有开源OH版本适配能把Web技能栈迁移到移动端所以选它属于典型的成本驱动决策。但这里有一个容易误导新人的点OpenHarmony上的RN并非官方主推的一等公民它依赖社区维护的OH适配分支Native端的桥接层需要自己编译、自己适配。也就是说你不能假设在Android上能跑的RN代码拿到OpenHarmony上就能100%原样运行。尤其是文件系统相关APIAndroid用的requestLegacyExternalStorage那套权限模型跟OH的沙箱机制完全不一样所以从一开始就要做好“桥接层单独开发”的心理准备。在实际项目里我们采用了分层策略业务层用RN TypeScript负责界面、流程、状态管理能力层用ArkTS/Java写原生模块通过RN的NativeModules暴露给JS调用。文件读取、分片、持久化续传记录这些重活全部下沉到原生侧JS只做编排。这样既保住了RN的开发效率又把不可控的系统差异隔离在桥接层排障时能少一半痛苦。1.2 文件上传场景与断点续传的核心价值先明确“断点续传”在什么场景下才值得做。如果只是上传几十KB的文本直接fetch一把梭就行断掉重传也无所谓。但真实业务往往要面对几百MB甚至几个GB的视频、安装包、离线地图包。网络环境又是办公Wi-Fi或者移动热点稳定性很玄学。这个时候没有断点续传就意味着任何一次中断都要推倒重来用户心态直接炸裂。断点续传的价值分为两层。第一层是“省流量、省时间”客户端已经传完的分片不需要重新传输第二层是“状态可恢复”即使App被系统杀掉、甚至手机重启上传任务还能从上次结束的位置继续。这背后牵扯到三个核心能力文件分片把大文件切成固定大小的小块逐块上传。进度记录每个分片的上传状态需要持久化且要能跟服务端校验。服务端组装服务端按分片序号拼接并能根据请求头响应“从哪个分片开始续传”。三者缺一不可。很多新手只做了前端分片没做持久化和服务端校验结果App重启后进度又丢了等于白做。所以这一整块必须当成一个系统来设计而不是单纯写个上传函数。1.3 技术选型RN与原生能力桥接RN本身没有直接操作文件分片的能力它的fetch或XMLHttpRequest只能做整体上传。要让RN支持断点续传最干净的做法是原生侧封装“文件读取”模块支持从指定字节偏移读取指定长度返回二进制数据或文件路径。原生侧封装“文件信息”模块返回文件大小、修改时间、文件哈希等元数据。JS侧编写上传调度器管理分片列表、并发数、失败重试、续传记录。这里我不建议在JS侧用base64处理大文件分片。一个几十MB的文件转base64会膨胀33%再传到Java/ArkTS层做解析内存瞬间爆炸。正确姿势是JS只传递分片的起始字节和长度原生模块负责读取数据并返回临时文件路径或字节流。如果服务端接受multipart/form-data可以直接把分片作为临时文件提交如果走二进制流就把字节流转成ArrayBuffer再发请求。除此之外还要考虑RN版本的兼容性。我们用的是RN 0.68以上的分支配合OH的适配包NativeModules的通信方式跟标准RN一致。只要桥接模块注册成功JS侧调用起来毫无障碍。唯一需要注意的是一些异步回调的线程模型OH上某些原生接口的回调可能不在UI线程需要手动切换到JS线程再返回Promise否则RN这边会收到空数据。这点在排查问题时非常隐蔽后面章节会具体说。2. 断点续传的原理与实现方案设计2.1 断点续传的本质分片、记录、续传用一句话解释断点续传把大文件切分成有序分片记录每个分片的上传状态从中断处继续传输最终拼接还原。分片的意义不只是为了续传它还能解决大文件上传时的内存压力。RN的fetch如果直接读整个文件原生侧需要把完整二进制对象放进内存。一个1GB的文件即便手机内存够系统也可能因为耗电和GC问题杀掉进程。分片后每片只有1~5MB内存完全可控。记录则是续传的地基。每上传一个分片就需要把“分片序号 文件ID 已传长度”写到本地存储。我习惯于用SQLite或者文件类型的键值存储都行但必须保证原子性——不能出现“服务端收到分片了本地没记录结果重传”这种重复数据。对于重复数据服务端可以幂等处理但客户端最好也尽量规避。续传的机制一般有两种。一种是基于文件指纹上传前先计算文件哈希或取文件大小修改时间组合生成全局唯一文件ID。服务端根据文件ID查询“已存在分片列表”客户端只上传缺失的分片。另一种是基于本地进度客户端只记录自己本地已传的分片重启后直接跳过。前者的健壮性更好能应对多端上传同一个文件的场景后者实现简单但对客户端状态依赖强。我的项目采用的是“双保险”本地上传任务里存分片状态同时上传完成后跟服务端校验已接收分片数。2.2 文件分片策略与参数计算分片大小不是拍脑袋定的它要综合考虑网络带宽、服务器接收能力、以及失败重试成本。行业里常用1MB到8MB少数大文件会切到16MB。我这次选的4MB理由很好算假设带宽是2MB/s传单片最多需要2秒。如果失败重传代价也才2秒。如果分片切到16MB带宽波动时单片传输超过10秒中途断开的概率变大重传代价高。分片过小也不行比如256KB会放大网络请求次数。一个1GB文件要发4096次请求服务端压力太大客户端线程调度开销也上去了。还有一个参数容易被忽略服务端的单次请求体大小限制。有些网关或中间件默认限制10MB超过就直接拒绝。选分片大小时必须先确认这条红线。如果走公网我建议保守点4MB或2MB都行。内网环境带宽高且稳定可以放宽到8MB。分片数量的计算用Math.ceil(fileSize / chunkSize)即可。需要特别注意的是最后一个分片可能小于分片大小上传时不能按固定长度截取要按实际剩余长度读取。还有文件名里的特殊字符生成分片记录时最好统一编码避免因为路径问题导致读写失败。2.3 续传记录的管理方式续传记录是断点续传的核心状态数据必须做到“可重建、可校验、可清理”。我设计的数据结构里至少包含uploadId全局唯一的任务标识建议用文件哈希 时间戳生成避免重复任务。filePath源文件绝对路径用于重新读取分片。fileName展示名称服务端拼文件名用。fileSize总大小。chunkSize分片大小。totalChunks总分片数。uploadedChunks已经成功上传的分片序号集合使用有序数组或位图存储。status任务状态包括waiting、uploading、paused、finished、failed。存储位置我选在应用私有目录下的SQLite里因为RN生态里有react-native-sqlite-storage的OH适配。简单任务也可以用JSON文件存但并发写入容易丢数据。注意不要在AsyncStorage里存大文件的分片完成列表AsyncStorage适合KV小数据上G字节的文件会拖垮它。每次进度更新时不要实时写入存储。上传是高频操作每传一个分片就写一次数据库会卡UI。建议延迟批量写入内存里维护一个Set攒够10个分片或间隔2秒再落盘一次。一旦App进程被系统杀掉最多丢最近10个分片的记录服务端校验后重传即可影响可控。3. React Native与OpenHarmony桥接实操3.1 环境配置与RN工程创建OpenHarmony上跑RN环境配置比普通RN项目要繁琐得多。首先你需要一个基于OH SDK的RN运行环境目前社区主流的做法是拉取OH适配版的RN源码工程再用DevEco Studio打开并编译。这里我建议直接用官方提供的模板工程不要自己从头配。模板工程里已经包含了RN的OH库、Hermes引擎的OH实现、以及NativeModules注册的示例代码。创建完成后你需要用npm安装react-native的OH适配包然后在entry/build.gradle里加上RN相关依赖。有一个点容易踩坑RN包名和OH应用包名必须一致否则JS侧找不到Native模块。我当时因为改过包名调了整整两天才发现是这里的问题。如果你也用DevEco Studio注意看ohosModuleName和host的配置。工程能跑起来后优先验证桥接是否通。写一个最简单的原生模块返回一个字符串JS侧调用并显示。这个哑巴模块验证通过再开始封装文件能力也不迟。3.2 原生模块封装获取文件信息、分片读取原生侧我封装了两个核心方法。第一个是getFileInfo(path)返回文件大小和修改时间// ArkTS伪代码实际以你用的语言为准 export class FileInfoModule { getFileInfo(path: string): PromiseFileInfo { return new Promise((resolve, reject) { try { let file new File(path); if (!file.exists()) { reject(new Error(file not exists)); return; } let info { size: file.length(), lastModified: file.lastModified() }; resolve(info); } catch (e) { reject(e); } }); } }第二个是readChunk(path, offset, length)读取指定分片的字节内容。这里要注意一定不要直接返回一个超大的字节数组给JS否则跨桥接通信会卡死。我采用的做法是先把分片写到一个临时文件然后返回临时文件的uriJS侧直接拿这个uri做上传。听起来多了个IO但避免了JS和原生之间的大对象拷贝实测稳定很多。封装完成后需要把这几个方法注册到RN的ReactPackage里。注册完重编原生工程JS侧就能通过NativeModules.FileInfoModule访问了。3.3 JS层实现上传任务管理JS层的任务管理是整个断点续传的大脑。我设计了一个上传调度器主要职责接收上传请求文件路径、服务器URL、分片大小等。计算分片列表。启动并发控制同时最多上传3~5片避免带宽拥堵。每个分片完成后更新内存状态并触发持久化。处理暂停、取消、失败重试。并发数怎么定我用的公式是Math.min(4, Math.max(1, Math.floor(availableNetworkThreads / 2)))但移动端实际测试下来并发3个分片比较稳。并发太高会导致每个分片的网络时延飙升而且容易触发服务器限流。并发太低每片2秒10个分片串行就要20秒用户等不起。调度器里还需要一个“分片状态表”用一个Mapnumber, boolean记录每个分片是否完成。初始化时根据持久化记录填充已完成的序列。开始上传时逐个跳过已完成分片对未完成的分片发起请求。每当有分片完成当前计数加一然后从待执行队列里拉取下一个分片任务。这样自然形成了带并发上限的滑动窗口。4. 核心代码实现手把手写断点续传4.1 后端接口约定与demo服务断点续传不是前端单方面能搞定的事后端接口必须有三个能力GET /upload/status?fileIdxxx查询该文件已上传的分片序号。POST /upload/chunk上传单个分片请求体是二进制分片数据头信息带fileId和chunkIndex。POST /upload/complete所有分片传完后通知服务端合并。服务端组装分片时要按chunkIndex顺序写入不能只依赖客户端上传顺序。因为并发上传时分片到达顺序可能是乱序的甚至是重复的。接口必须设计成幂等比如“第5片已收到”再次收到第5片时直接返回成功即可。这里给一个简化的Node.js demo服务只展示核心逻辑// demo服务upload-status 与 upload-chunk const uploadMap new Map(); // fileId - {chunks: Set, totalSize, receivedSize} app.get(/upload/status, (req, res) { const fileId req.query.fileId; const info uploadMap.get(fileId) || { chunks: [] }; res.json({ fileId, uploadedChunks: Array.from(info.chunks) }); }); app.post(/upload/chunk, (req, res) { const fileId req.headers[x-file-id]; const chunkIndex parseInt(req.headers[x-chunk-index], 10); const data req.body; // 二进制 if (!uploadMap.has(fileId)) { uploadMap.set(fileId, { chunks: new Set(), sizeMap: new Map() }); } const item uploadMap.get(fileId); if (!item.chunks.has(chunkIndex)) { item.chunks.add(chunkIndex); item.sizeMap.set(chunkIndex, data.byteLength); } res.json({ received: true }); });上面的代码省略了文件落盘实际生产环境需要把二进制写入磁盘并维护一个临时分片目录。合并时按chunkIndex逐个写入最终文件。如果你用对象存储OSS也可以用它的分片上传接口思路完全一样。4.2 RN前端上传核心代码前端代码我用TypeScript写。首先是通过原生模块获取文件分片信息再生成任务对象import { NativeModules } from react-native; const { FileInfoModule } NativeModules; export interface UploadTask { fileId: string; filePath: string; fileName: string; fileSize: number; chunkSize: number; totalChunks: number; uploadedChunks: Setnumber; status: waiting | uploading | paused | finished | failed; } async function createUploadTask( filePath: string, fileName: string, chunkSize 4 * 1024 * 1024 ): PromiseUploadTask { const info await FileInfoModule.getFileInfo(filePath); const fileId ${fileName}_${info.size}_${info.lastModified}; const totalChunks Math.ceil(info.size / chunkSize); // 从持久化存储恢复已上传进度 const savedChunks await loadProgress(fileId); return { fileId, filePath, fileName, fileSize: info.size, chunkSize, totalChunks, uploadedChunks: new Set(savedChunks), status: waiting, }; }上传单个分片时我先让原生模块把指定范围的数据落地为临时文件然后使用fetch上传。这里没有直接读二进制到JS是因为大数据跨桥会有性能问题async function uploadChunk(task: UploadTask, index: number): Promisevoid { const start index * task.chunkSize; const length Math.min(task.chunkSize, task.fileSize - start); const tempUri await FileInfoModule.readChunkToTempFile(task.filePath, start, length); const form new FormData(); form.append(file, { uri: tempUri, name: chunk, type: application/octet-stream, }); const res await fetch(${BASE_URL}/upload/chunk, { method: POST, headers: { x-file-id: task.fileId, x-chunk-index: String(index), }, body: form, }); if (!res.ok) { throw new Error(upload chunk failed: ${index}); } }注意readChunkToTempFile这个原生方法要负责临时文件的清理。你可以每次上传完分片后删除对应临时文件或使用系统临时目录系统会定期清理。但如果上传过程中进程被杀临时文件可能残留所以最好在上传任务初始化时做一次“清理回收”操作对比完所有分片后删掉不在分片集合内的临时文件。4.3 暂停、失败重试与进度回调暂停和取消不能直接干掉Promise否则底层网络请求可能悬空。正确做法是设置一个cancelled标志位在每片上传开始前检查如果已暂停则不再创建新的分片请求。同时要把正在传输中的请求发一个AbortController中止。失败重试要区分是网络错误还是业务错误。如果是网络断开、超时这种大概率是临时问题可以退避重试。我用的策略是每片最多重试3次指数退避间隔分别1秒、3秒、7秒。如果重试3次还不行任务状态置为failed同时把未完成分片列表持久化等待用户手动恢复。进度回调使用了一个onProgress(percent)函数。百分比计算不能简单用已上传片数/总分片数因为最后一个分片可能小于标准分片服务端合并时也以字节数为准。我的做法是维护一个uploadedBytes变量每次分片成功后累加实际字节数用uploadedBytes / totalBytes得到真实进度。这样即使分片大小不均进度也是平滑的。function startUpload(task: UploadTask, onProgress: (percent: number) void) { let uploadedBytes task.uploadedChunks.size * task.chunkSize; // 初始近似值 // 循环上传分片 // 并发控制队列 const queue task.indexes.filter(i !task.uploadedChunks.has(i)); let running 0; let cursor 0; async function worker() { while (cursor queue.length task.status uploading) { const idx queue[cursor]; try { await uploadChunk(task, idx); task.uploadedChunks.add(idx); uploadedBytes Math.min(task.chunkSize, task.fileSize - idx * task.chunkSize); onProgress(uploadedBytes / task.fileSize); } catch (e) { // 重试继续 } } } const maxConcurrent 3; for (let i 0; i maxConcurrent; i) { worker(); } }上面的代码是简化版实际项目还要加“任务完成后调用complete接口”的逻辑。注意在uploadedChunks更新后要定期调saveProgress(task)持久化。5. 常见问题排查与避坑指南5.1 文件权限与沙箱路径问题OpenHarmony上的文件权限模型比Android更严。应用只能直接访问自己沙箱目录内的文件如果用户从相册选一个文件拿到的是file://或content://的URI但原生模块里直接用File(path)可能访问不到。需要先用底层文件管理器转换为应用可读的临时路径或者通过OH的SAFFStorage Access Framework接口授权后再读取。我遇到最多的问题是上个版本用/data/storage/el2/base/files这种路径还能读升级后直接抛Permission denied。这是因为目标文件所属应用可能不是自己。解决方式是做一层“文件归集”把需要上传的文件先通过原生接口复制或移动到应用私有目录之后再操作副本。这样权限就完全可控了。上传完成后如果没有业务留存诉求及时把临时副本删掉免得占用户存储空间。5.2 分片顺序与并发控制很多新手上来就用Promise.all一次把所有分片都发出去结果服务端小水管被瞬间打满大量连接超时。正确的并发数应该根据带宽和文件大小动态调整。我在项目里采用了一种简单自适应开始时并发3如果连续5个分片在1秒内完成说明带宽富余把并发提到4如果连续3个分片耗时超过5秒说明网络紧张把并发降到2。实测这种策略能让大文件上传时间缩短20%左右同时对网络波动也很友好。还有一个点容易被忽略分片上传必须带序号服务端不能依赖接收顺序。哪怕你单线程按顺序发网络层也可能乱序。只要服务端按序号落盘并幂等校验就不会出问题。5.3 网络切换与任务恢复从Wi-Fi切到4G时系统会销毁当前网络连接所有在途的fetch请求都会中断。任务恢复机制要能感知这种变化。RN里可以监听到网络状态变化事件然后做两件事更新调度器状态把正在传输的分片标记为“未完成”。重新从持久化进度恢复任务。如果任务状态是“failed”给用户在界面上一个“重新上传”按钮点击后重新查询服务端状态比对本地记录补传缺失分片。千万不要无脑从头传否则就失去了断点续传的意义。一个真实的教训某次测试时我从Wi-Fi切到热点App直接闪退。最终定位是原生侧网络请求库在切换网络时抛了异常但没有在Promise中处理导致上层异步中断继而内存状态不一致访问了空指针。后来我在原生桥接层把所有异常都包成了标准Error返回JSJS侧统一catch问题解决。5.4 性能优化建议最后分享几个提升流畅度的细节尽量用文件流读取分片不要一次性把整片读进内存数组。OH原生侧提供流式读取接口读完一部分就写临时文件可以有效降低峰值内存。临时文件复用每次读取分片都生成新临时文件不仅慢还会积累垃圾。可以预分配一个分片数量相同的临时文件组循环使用减少创建和销毁的开销。进度UI要节流RN的setState如果每传一个分片就触发一次会导致界面卡顿。建议用requestAnimationFrame或throttle每300毫秒最多刷新一次进度条。上传前先计算文件哈希虽然计算耗时但能防止“改了文件的某个字节URL不变服务端返回全部已传完”这种逻辑错误。文件哈希值可以作为文件ID的一部分确保内容变更后重新生成新任务。你可以在上传完成后把哈希值透传给服务端存档。上面说到的临时文件复用实际操作时可以用一个简单的文件描述符池。每个分片对应一个固定的临时文件名比如chunk_${index}.tmp上传完成后立即删除。如果任务中途崩溃下次启动时扫描标记文件并清理。这样既保证内存不爆也不会留下垃圾文件。最后说点实在的这个项目做完我最大的体会是断点续传没太多黑魔法它就是分片、校验、恢复这三个基本功的组合但真要把每个环节做稳需要前后端一起配合。尤其是服务端的幂等校验和文件ID的生成规则一定要在前期定清楚不然联调时会吵翻天。React Native在OpenHarmony上跑桥接层的稳定比UI性能重要得多因为文件上传这种高频IO一旦在原生和JS之间反复拷贝大对象必卡。最稳妥的思路永远是原生负责读文件JS只做编排。最后再分享一个小技巧开发时用真机测一下弱网环境不要只在模拟器里跑因为模拟器的网络栈和文件路径跟真机差异很大很多崩溃只有真机才会复现。断点续传这种东西测试阶段多流一次汗上线后就能少挨一顿骂。
RELATED

相关推荐

Linux 下 chmsee 阅读 CHM 文档:编译依赖、中文乱码修复与替代方案

Linux 下 chmsee 阅读 CHM 文档:编译依赖、中文乱码修复与替代方案

简介:chmsee 是一款面向 Linux 用户的 CHM 文档阅读工具,主要解决 Linux 系统无法直接打开微软编译的 HTML 帮助文件这一痛点,适合需要在 Linux 环境下查阅技术手册、开发文档与电子书的中文用户。资源包共收录 111 个文件,以 C 源…

📅 2026/10/13 3:57:13
Unity鱼眼Shader实战:从投影原理到性能优化

Unity鱼眼Shader实战:从投影原理到性能优化

1. 鱼眼Shader到底能做什么第一次接触鱼眼Shader是在做一个赛车模拟项目的时候,当时想给玩家一个“坐在驾驶舱里用广角镜头看世界”的沉浸感。普通透视相机在高速行驶时视野太窄,两侧的景物一闪而过,玩家根本来不及反应,体验很差。…

📅 2026/10/13 3:57:13
OpenClaw 安装卡在 libsignal?两个模块的编译与排查指南

OpenClaw 安装卡在 libsignal?两个模块的编译与排查指南

简介:这份资源面向在企业内网环境下部署 OpenClaw 的开发者与运维人员,聚焦企业防火墙导致 libsignal-node 从 GitHub 下载失败这一典型痛点,提供 whiskeysockets/libsignal-node 与 libsignal 两个必需模块的离线包,可直接放入 O…

📅 2026/10/13 3:57:13
MORE NEWS

更多资讯

📰

Dinic最大流算法详解:分层图、多路增广与当前弧优化

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

📰

ReactDOMRoot源码解析:从createRoot到render的完整链路

做React源码分析&#xff0c;很多人一上来就啃scheduler调度器或者fiber架构&#xff0c;结果被lane、workLoop这些概念劝退。我自己的经验是&#xff0c;不如先从ReactDOMRoot入手——这是每个React应用真正的起点&#xff0c;你天天写的createRoot(...).render(<App/>)…

📰

MySQL学生选课系统源码实战:表结构设计与事务并发控制

简介&#xff1a;这份资源是面向高校计算机相关专业学生与毕业设计开发者的一套MySQL学生智能选课系统完整资料&#xff0c;包含源码、数据库与配套论文&#xff0c;适合作为课程设计、毕业设计或SSM框架练手项目。系统围绕学生、教师与课程之间的信息交互展开&#xff0c;重点…

📰

MySQL学生智能选课系统:数据库设计、事务锁与高并发避坑指南

简介&#xff1a;这份资源是面向高校计算机相关专业学生与毕业设计开发者的一套MySQL学生智能选课系统完整资料&#xff0c;包含源码、数据库与配套论文&#xff0c;适合作为课程设计、毕业设计或Java Web入门练手项目。系统围绕学生选课场景设计&#xff0c;覆盖课程浏览、教师…

📰

CPU指令执行五阶段硬件原理与流水线设计

1. 这不是普通笔记&#xff0c;是理解CPU如何“思考”的底层地图你有没有想过&#xff0c;当你敲下gcc hello.c&#xff0c;再运行./a.out&#xff0c;那一行行C代码究竟是怎么变成屏幕上跳出来的“Hello World”的&#xff1f;它没长腿&#xff0c;不会自己跑&#xff1b;它没…

📰

PCA-LSTM多变量时间序列预测:从高维特征压缩到时序建模实战

既然标题已经这么直白了&#xff0c;我也就不绕弯子。PCA-LSTM预测模型&#xff0c;说白了就是先让PCA把高维特征“挤一挤”&#xff0c;去掉冗余和噪声&#xff0c;只留下最能代表原始数据变化的主成分&#xff0c;然后再把这条压缩后的时间序列喂给LSTM去学长期依赖&#xff…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬