jsmnを使って起動時のタイムラインJSONをtoot単位で処理して表示する #83
Draft
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
このままマージされることは想定していないコンセプトレベルの差分です。
課題
LUNAのように MC68030 20MHz 16MB的なマシンだと、
起動時のデフォルトのホームタイムライン取得の20トゥート分のjsonに対する
sjson_decode()
のメモリ消費量(?)のせいでスラッシングが発生して、タイムライン表示開始まで数時間かかることがある。
(ちなみに 24MB の sun3/60 だと分単位で出るので、そのへんに境界があるっぽい)
その対策で
-tllimit
オプションを作ってもらったわけですが、久しぶりに動かすと忘れがち。対策
ホームタイムラインのJSONが ARRAYであることを想定して、ARRAY要素のトゥート単位に分解した上で
sjson_decode()
に投げるようにする。実装
適当にChatGPTにアイデアを聞くと、最初は自力でjsonをパースして要素に分解するように言われたが、
\"
のエスケープチェック等々でバグるとめんどくさいから既存の実装でなんとかならないか、と聞くとhttps://github.com/zserge/jsmn が軽いという話であった。
パースした結果が元のJSON文字列の先頭からの開始バイト数と終了バイト数で出てくるので、
適当にARRAY要素単位に分割して
strndup()
してsjson_decode()
に突っ込んでやるとLUNAでも起動して 2分程度で 20トゥート分のタイムライン表示が開始されるようになった。
(TLS認証に 50秒くらいかかるので、実質1分ほど)
要検討事項
というところ。(本当に採用するならREADMEにも追記必要)
とはいえ自前で書いてもコード量的には変わらない一方で微妙にバグりそう。
かといって sjson を改造するのも本末転倒?
上限いくつの要素が放り込まれるのかが見積もれない。ざっと試すと 20トゥートで 3300トークンくらいになったが、
変動量と条件がわかっていない。
sjson_create_context()
とsjson_destroy_context()
をどのタイミングで呼ぶべきか、というのをちゃんと調べていない