Anki 同步大小限制撞墙怎么办?3 级操作把上传门槛从 100MB 提到 500MB
2026/9/15 13:44:28 网站建设 项目流程

Anki 同步大小限制撞墙怎么办?3 级操作把上传门槛从 100MB 提到 500MB

【免费下载链接】ankiAnki is a smart spaced repetition flashcard program项目地址: https://gitcode.com/GitHub_Trending/an/anki

Anki 在同步大型集合时,客户端或服务器会报collection exceeds size limit,这就是 Anki 同步大小限制机制在拦截你。本文先定位报错产生的 2 处代码门槛,再按“瘦身文件 → 自托管改环境变量 → 验证生效”的顺序给出可执行的 3 级操作,并列出提高上限时最容易踩的 3 个坑。

定位报错:代码里有两处会拒绝你的上传

先打开 rslib/src/sync/collection/upload.rs,找到服务端处理器handle_received_upload。它把上传数据解压后与阈值比对,超限就直接返回那条错误文案:

let max_bytes = *MAXIMUM_SYNC_PAYLOAD_BYTES_UNCOMPRESSED as usize; if new_data.len() >= max_bytes { return Ok(UploadResponse::Err("collection exceeds size limit".into())); }

这行判断是同步服务器的“最后一道闸”:不管你传得多快,解压后的体积必须落在阈值内。

客户端侧还有一道闸,但只对 AnkiWeb 域名生效。full_upload_with_server只在 endpoint 包含ankiweb时调用check_upload_limit,指向自托管地址时直接跳过本地检查。所以完整的门槛结构是:

  • 客户端闸:仅对 ankiweb 地址生效,校验上传前的本地文件体积;
  • 服务器闸:任何同步服务器都执行,校验解压后的数据体积,阈值为环境变量的3 倍
  • 传输闸:服务器在上传接口上挂的 body 上限取的是压缩后阈值,超大的请求在传输层就被掐断,根本到不了上面的比对代码。

统计面板里的卡片数、复习趋势都来自集合库。上传门槛没过,各设备看到的就是旧数据,误差会随时间越拉越大。

为什么集合文件越来越大:上传前 Anki 已经帮你做过的瘦身

先弄清自动瘦身机制,才知道手动优化还剩多少空间。rslib/src/collection/mod.rs 中的before_upload会在每次全量上传前一次性清掉墓碑记录与各类待处理 USN,标记 schema 变更,最后执行数据库压缩(storage.optimize())。这一步不删任何学习数据,只是把数据库压实并写入新版本号,让同步协议能判断哪些部分变了。

也就是说:每次同步文件都会自动减掉一部分死重,剩下的体积来自存活数据和媒体。手动优化的空间集中在三点:

  • 运行“检查媒体”,删除未被卡片引用的图片与音频,这通常是最大的减重项;
  • 压缩大图、把超长文本换成外链;
  • 把已学完的牌组归档,别长期留在主集合里。

添加笔记界面是媒体进入集合的入口。每插入一张图片、每录一段音,都会成为集合文件的常驻成员,同步时要整份带出去。

抬高上限:自托管 Anki 同步大小限制用 MAX_SYNC_PAYLOAD_MEGS 配置

🔧 阈值本身只来自一个环境变量,rslib/src/sync/request/mod.rs 的取值逻辑很直白:

pub static MAXIMUM_SYNC_PAYLOAD_BYTES: LazyLock<usize> = LazyLock::new(|| { env::var("MAX_SYNC_PAYLOAD_MEGS") .map(|v| v.parse().expect("invalid upload limit")) .unwrap_or(100) * 1024 * 1024 });

默认 100MB,解压后阈值是它的 3 倍,HTTP body 上限用压缩值。阈值在进程启动时读取,改完必须重启容器。镜像按官方 docs/syncserver/README.md 构建,启动时多带一个参数即可,不用碰源码:

docker run -d \ -e "SYNC_USER1=admin:admin" \ -e "MAX_SYNC_PAYLOAD_MEGS=500" \ -p 8080:8080 \ --mount type=volume,src=anki-sync-server-data,dst=/anki_data \ --name anki-sync-server \ anki-sync-server

客户端在“工具 → 首选项 → 网络”里填入自定义同步服务器地址,账号密码与SYNC_USER1对应。由于客户端对非 ankiweb 地址会跳过本地检查,这条链路的上限完全由你服务器的环境变量决定。

验证新阈值生效

✅ 先同步一个小型集合确认链路通,再用接近新阈值的集合压一次,最后用docker logs anki-sync-server确认没有体积相关报错。仍被拒绝时,对照下一节的 3 个误区排查。

避坑:提高同步大小限制的 3 个误区

  • 误区一:改了环境变量就够了MAX_SYNC_PAYLOAD_MEGS只被服务器进程读取。客户端还指着 AnkiWeb 时,本地那道 100MB 闸依旧生效,上传会在发出前被拒;
  • 误区二:500MB 指解压后 500MB。解压阈值是环境变量 × 3,即 1.5GB;传输层 body 上限仍按压缩值算,两者口径不同,排查时要分清卡在哪一层;
  • 误区三:上限提高了就不用备份。⚠️ 动配置前,先把集合文件复制一份或导出完整.apkg。自托管服务器的全部数据存放在单个 volume 里,备份责任在你自己。

集合体积若真到了几个 GB 量级,正确的方向是把媒体与结构化数据分开传输,官方同步协议正朝这个方向演进。现在就去“首选项 → 网络”确认客户端实际指向哪台服务器,并检查它是否已设置MAX_SYNC_PAYLOAD_MEGS

【免费下载链接】ankiAnki is a smart spaced repetition flashcard program项目地址: https://gitcode.com/GitHub_Trending/an/anki

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询