変数の保存処理を無効化
skriptは変数の値の変更回数をカウントしていて非同期で5分毎に合計で1000回の変更があるとcsvに保存する処理があります
変数の量が増えると保存するときに大きなラグが発生します
すべての変数がラム変数である場合、すべての変数がグローバル変数のときより約2倍速かったです
なのでサーバーの起動時にラム変数に変換して、終了時にグローバル変数に変換するskript作りました
起動時と終了時の速度を犠牲にする代わりに稼働中の速度を上げました
ラム変数にすると500000個の変数を作って0.5秒毎に保存するようにしてもラグなく動かせました!
(1個の変数が全体の速度に与える影響は非常に小さかったですが)
・コード
https://pastebin.com/FhKhp09r
Skriptのみ
ファイル名は
!.sk
のように先頭に!を付けて保存してください
config.sk
のパターンを(?=-).*
に書き換えてください
ハイフン付きの変数{-a}
がグローバル変数になるようにしています
今まで通り{list::1}
のように書いて大丈夫です
※稼働中に保存されないのでサーバーが正しく終了されないと変数のデータが消えるかもしれません4 Replies
控えめに言って神
ただこれって異常終了すたらロルバですかp
?
うん
パソコンの電源を落とすとかコンソールを直接閉じたりしなければ消えることはない
使わない場合でも5分毎に保存されてるから8分稼働してるサーバーが異常終了した場合は3分前にロルバする
あと一度skファイルをdisableすれば稼働中に保存される
保存後にenableすればそのまま稼働できる
ふむふむ
正しく停止ってのは
/stop ですか?
うん
saveTaskとは別にsaveThread、writeThread、backupTaskがありました
変数が異なる値または同じ値に変更されたときにsaveQueueというキューに変更された変数の情報が入ります
このキューは最大2^31-1個の変更情報が入ります
saveThreadは非同期に遅延なしでグローバル変数をsaveQueueからchangesQueueにいれます
このキューは最大1000個の変更情報しか入りません
(a)
10秒以内に300を超える変更情報がキューに入れられたとき
Cannot write variables to the database...
が表示されます
(b)
指定の変数をchangesQueueの末尾に移動するとき10秒以上の遅延があると
Skript cannot save any variables to the database...
が表示されます
writeThreadは非同期に遅延なしでchangesQueue内の変更情報をメモリに書き込みます
backupTaskはメモリ上に書き込まれたデータをcsvに書き込みます
すべての変数がラム変数である場合、changesQueueに詰められる処理が無くなるので'(a)(b)の処理もなくなります
5分毎の保存処理以外に、変数の変更情報の処理の効率も上がるようです
あとコード直しました