ブラウザで大量データ処理をした覚書
- ryunosinfx
- 1366
- 1
- 1
- 0
いやーやっぱりいろいろやってみるもんだな ・10万オーダーのデータをブラウザで触ると簡単にOOMになる ・なので、Indexeddbに逃してWebWorkerをこき使いましょうね ・WebWorkerちゃんもだんだんGCできつくなる ・そんな時はサクッとTerminate!そして新規召喚!あらメモリがきれい! ・indexedb駄目
2024-01-20 01:33:51・WebWroker でindexeddbをさわると同じDBでは当然ロック競合が起こって遅い ・BroadCastAPIはWebWorkerちゃんとの1:1通信よりメモリに厳しい ・やはりまる一日稼働を目指してブラウザで処理を考えるとGCがキツイ ・だんだんメモリにゴミが溜まってGCで速度がでなくなる ・その点Workerに投げるはあり
2024-01-20 16:57:32・しかしWebWorkerにデータを渡す量が多いと遅い ・ここをシェアードオブジェクトにする(でもArrayBufferからデータ形式の変更で多分遅い) ・ブラウザがバックグラウンドになると遅くなるから顔帳に習って小さい音を鳴らす ・しかしWebAudioはユーザーアクションがないと作動しない ・リロードしたい
2024-01-21 02:50:07なんつうかねGCなんよ GCは悪くないけど 「うおぉぉぉぉぉその調子だ!いっけー!」 って言ってるときに 「スんッ」ってGCで動きが鈍くなるの。 でGC頑張ってるんだけど、カクついて動かなくなった後に突然のOOMで落ちると。 これを回避しようとするとオブジェクトをカジュアルに作らないとか
2024-01-21 02:52:36コールバック関数をループの中で作るのやめようぜ とか、要らなくなった配列は中身ちゃんと空にしようぜとか、そのオブジェクト終了コマンドあるんじゃない?はちゃんと終了するとか頑張らないと駄目なんだけど… それってめちゃくちゃ時間かかるんよ。
2024-01-21 02:55:01なので、 ブラウザをWebRTCサーバーとして活用したい場合は ・ブラウザ本体のプロセスは画面描画とバックグラウンド化抑止に音を鳴らすこと、各Worker管理と取次に特化 ・Workerプロセスは定期的に作って殺すこと ・通信もできるだけWorkerプロセスに寄せ世代交代でも問題ない様ハンドオーバすること
2024-01-21 22:51:13あとはjsの体感的な省メモリ術としては できるだけオブジェクトを使いまわすこと 関数をstaticにしてnewしないこと 使い終わったオブジェクトと配列はきれいに内容をクリアすること クロージャーでの参照を避けること かねぇ GCでお片付けされるので 実際どうなの?は有るけれど。
2024-01-21 22:53:43想像してご覧、2000円で買ったジャンクスマホが OSにユーザー登録しないまま外部公開サーバーとして作動する様を〜 ※Googleアカウント無しで運用はどこまで危険なのだろうか、アプリがバージョンアップしない?
2024-01-21 22:55:51しかし秒間200件弱のwhile文からのリクエスト発行の上限が有るという単純にノンブロッキングをマルチコンテキストで実現しようとすると1スレッドでやるとどうしてもWhile文の中でsetTimeoutを使用したwaitを噛まして他のコンテキストを待つのだがそこで1msでも待てば 他の処理が0でも秒間1000まで
2024-01-22 20:55:56実際は5msはなにかでかかるらしく、200件未満で止まる。 当たり前と言えば当たり前。 したがってこの部分を突破したければ、Workerに投げるリクエストを秒間200弱を上限として別のworkerに出さないといけない。 Nested Workersで司令塔Workerに管理させる事になるのかな? nhiroki.jp/2018/10/29/nes…
2024-01-22 21:03:26まあWorkerはメモリを食うよね。 しかし、メモリリークを考えると一定時刻で殺したい。 そうするとブロッキングするAPI(indexeddbとか)まで含めて渡したい。やり取り情報はサマリーだけ寄越せ、言うことをきけ みたいな社会の縮図的な構造にせざる得ないな こう画面スレッドが制御可能な時間は有限と
2024-01-22 21:06:48Workerとやり取りするメッセージングもコピーコストがそこそこ高いからArrayBufferでバイナリ管理したい 等などが要望として上がってくる感じ。 秒間1000件を超えるリクエストの生成を考えるとネストしないと無理と。途中で一回でもノンブロッキングでwaitした処理が介入するチャンスが有ると1msは使う
2024-01-22 21:37:34WebRTC経由でリクエスト受付でだけど その辺のジャンクスマホがこっそりサーバーになるとかドキドキしないかい? ShardWorkerとかServiceWorkerとかWASMとかはとりあえず脇に置いておいて、こんな感じ。 メインスレッドでは1000件/秒のリクエスト処理は絶対こなせないので分散が必要という話。 pic.twitter.com/o3fnsyr3TH
2024-01-23 03:17:31中間管理職は期日(1秒単位)になったら結果報告書をメインスレッドに上げて、他の中間管理職とおしゃべりする会議をBroadCastAPIで持つ感じか。 一定時刻が経つと死ぬので、一定期間後、仕事の発注を控えて必要な引き継ぎをすると。
2024-01-23 03:23:40WebRTCのチャンネルもハンドオーバーしないと駄目だから、チャンネルの生存期間管理も必要だね。 こうしておかないと何がメモリリーク(これはjsエンジンとその仕様への浅い理解が主な原因だとは思う)を回避して安定稼働への鍵なんだと思う。
2024-01-23 03:26:12