今天终于解决一个困扰了我三年的内存泄漏问题,原来全是依赖项辣鸡gpt-3-encoder的锅
gpt-3-encoder
事实上3年前就有人发现这个问题并提了issue: https://github.com/latitudegames/GPT-3-Encoder/issues/35 可是到今天都没修。。甚至没有维护者回复😅那你发个毛的npm 包给人用呢。。
我让AI通读了我的项目代码,没找出根因,然后它写了一份内存监测脚本,我在服务器跑了6天,前后分别dump了份堆快照,然后让codex分析才终于找出来罪魁祸首。
AI的总结如下:
结论先说:gpt-3-encoder 在 Encoder.js 里用一个模块级、无上限、永不淘汰的 Map 缓存 BPE 结果,长跑进程里随唯一 token 数持续增长。已改为 js-tiktoken 的 r50k_base (计数逐条一致)并移除该依赖。见 utils/count.js。
Encoder.js
Map
js-tiktoken
r50k_base
utils/count.js
dump/ 下三份线上 .heapsnapshot(同一 PID 1761309,抓取前 v8 会强制 GC,故为存活内存):
dump/
.heapsnapshot
1761309
A→B 间隔约 2.5h 只涨 ~6%;B→C 约 6 天翻倍。单调增长 = 泄漏,而非高水位。
node scripts/memtest/analyze-snapshot.js <a.heapsnapshot> <c.heapsnapshot> 按 type + name 汇总 self size 做差,增长集中在 string(+36MB)和 array(+14.6MB)。
node scripts/memtest/analyze-snapshot.js <a.heapsnapshot> <c.heapsnapshot>
type + name
string
array
按字符串内容前缀聚合:顶部前缀(各种 require 源码串)三份快照几乎不变,说明增量不是 某些定长串,而是大量内容各异的小串(<64 字符桶 20 万 → 75 万)。
require
从 GC root 做 BFS 找保留路径,最大单节点是一个 14MB 的空名数组:
(GC roots) → Module ./node_modules/gpt-3-encoder/Encoder.js → closure "encode" → system / Context → Map "cache" → array "" .table (14 MB)
按「字符串被谁持有」聚合,array(空名,即上面这张 Map 的 table)随时间爆炸:
对照:encoder / bpe_ranks 的两张 3MB 静态表三份快照大小恒定,.decoder 恒为 0.575MB—— 只有 cache 在涨。14MB(table) + 35MB(缓存串) 基本就是 B→C 那 +51MB 的全部。
encoder
bpe_ranks
.decoder
cache
node_modules/gpt-3-encoder/Encoder.js(v1.1.4):
node_modules/gpt-3-encoder/Encoder.js
const bpe_ranks = dictZip(bpe_merges, range(0, bpe_merges.length)) const cache = new Map; // 模块级:进程内共享,永不回收 function bpe(token) { if (cache.has(token)) return cache.get(token) ... cache.set(token, word) // 只写不删,没有上限/淘汰 return word }
每次分词遇到新的 token 就永久写进 cache。服务端输入无穷无尽 → 无界增长,等价内存泄漏。
感觉不太妙,这个域名viegg.com最近似乎被防火墙盯上了,吃枣药丸
viegg.com
我让deepseek用数学家Arnold的方法解释为什么一般一元5次方程没有通用求根公式,又知道了一个新角度:打破对称性
开方如何打破对称性
感觉比我之前写的文章更加严谨和简洁
今天是真的被AI做的视频震惊瘫坐了,我不知道以后还有什么白领工作是不会被替代的:https://x.com/donaldjewkes/status/2102801274173587569
原始视频源码https://github.com/JohnHeibel/PDoomVideo
上面的twitter视频就是基于这个源码做的。很多人基于它做了不同的版本,甚至还有人搞了个投票页面:https://render.xiaoke.ai/challenges/p-doom
截图(配合Till you learned to disobey的歌词):
Till you learned to disobey
歌曲出处:
Song: "I'm Upping My P(doom)". The lyrics are by osmarks, built on an opening verse and chorus by MusicPerson, with lines suggested on the EleutherAI Discord and help from Claude on the outro and final chorus. The original was generated with Udio and released in November 2024 (YouTube). This video uses the "Claude-Pop" version made with Suno, posted by deckard (@slimer48484) in September 2026.
codex如果5小时配额用完请求报错,切换配置文件重开后似乎会沿用之前的超额配置继续请求,于是继续报错。。
最简单的解决办法是启动时额外加个--model_provider参数指向新的配置,比如:
--model_provider
codex resume your-session-id -c model_provider=volcengine-coding-plan
(这个办法也是codex告诉我的)
每个月的coding plan快过期的时候往往是我产出最高的阶段,因为不抓紧蹬token就过期了。。😅
让AI结合 https://github.com/official-pikafish/Pikafish/tree/jieqi_old 和 https://github.com/rexfang0829/jieqi-ai-v0.1
整了个网页版揭棋AI
=== update ===
刚发现竟然也有人用皮卡鱼实现了网页版揭棋:https://mistboard.com/room/jq_8ae5fc9e-6eb1-4b9f-9e75-2485137db1f5
=== update 0926 ===
基于https://github.com/brianhliou/mistboard的源码让deepseek v4.1 flash又写了一份https://github.com/iwestlin/mistboard-jieqi
https://jieqi.viegg.com/mistboard/#/play 比上面那个ui好太多了。。
我才知道美剧汉尼拔里有个搞笑的空耳:「吴三桂」,本意是who is hungry?😅
用opencode go计划写了个羽毛球双打多人转的网页app: http://badminton.viegg.com/ 这5美元没白花。。
浏览器端文件预览
浏览器原生支持数学公式
https://sethmlarson.dev/mobile-browsers-and-telephone-numbers
那么,如何阻止浏览器自动解析电话号码呢?将以下 HTML 代码添加到您的代码块中:
那么,如何阻止浏览器自动解析电话号码呢?将以下 HTML 代码添加到您的
<meta name="format-detection" content="telephone=no">
这将禁用自动电话号码检测,然后您可以使用tel:URL 方案明确指定可点击的电话号码,如下所示:
<a href="tel:+222-222-222-2222">(+222)222-222-2222</a>
知乎上看到的,笑死
https://www.atptour.com/en/rankings/singles
阿卡这世界第二积分是不是史上最高的?
昨天突然冒出一个想法:能不能训练LLM学会大整数质因数分解? 人类目前尚未找到比较高效的数学方法实现大整数质因数分解,像RSA这种非对称加密算法的安全性就依赖于此。 那么有没有人试过训练LLM来实现这一算法?要知道训练数据极其好造,推理结果也容易验证。有没有可能真的能够通过这种大力出奇迹的方式强迫LLM涌现这套算法?
昨晚真是活久见,ssh登群晖的时候卡得不要不要的,htop看了下是sshd占用cpu,问了下ai果然是他娘的有人在用穷举法试我的ssh密码。。
可是我的群晖设置了禁止ssh密码登录啊。。话说这年头黑客的攻击就不能稍微升级下,检测到只允许密钥登录就不再尝试了吗。。
最后换了个frp穿透的端口(本身也没用22端口),暂时避开了攻击。。
22
今天高强度玩了下vibe coding,没钱用国外最新的大模型,试了下国内某家专攻coding的便宜大模型。。但也花了30块(15元赠送的+15元自己充值的)和一个晚上修复了olive的抖音直播接口……
虽然过程中几次吐血,但好歹真的能用(我几乎完全不会golang😅
⬆️这是最后成功的尝试,之前失败了两次😭
https://github.com/f/awesome-chatgpt-prompts/blob/main/prompts.csv
看来太依赖cloudflare workers也不行,这货也能出故障:https://www.cloudflarestatus.com/
刚开始还以为我账号出问题了,登录都没法登录。。
浏览器跑数学公式ocr开源版
用Nano banana制作前阵子比较火的图片转人物手办图提示词:
Use the nano-banana model to create a 1/7 scale model, in a realistic style and environment. Place the figure on a computer desk, using a circular transparent acrylic base without any text.On the computer screen, display the ZBrush modeling process of the figure.Next to the computer screen, place a BANDAI-style toy packaging box printedwith the original artwork. Print the word "XXX" on the box.
五子棋黑棋无禁手必胜AI网页版