1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

データベース構造について失敗談

Last updated at Posted at 2025-12-04

ご挨拶

はいどうも
知っている人も居るかもしれませんが実は私、こういうVCIを作ったんです。

モジュールで分けてはいますが、ここに入っているDB量は結構あって
誕生日 birthday_db:366日×10個
何の日 whatday_db:366日×10個
出来事 event_db:366日×15個
他にも細かいのが色々

前々からVCI読込み時や日付が変わる毎に妙にカクッっとくるとは思っていましたが・・・。

○きっかけ

重い腰を上げたきっかけはこれ、
https://blog.virtualcast.jp/blog/2025/05/vci_traffic_limit/
通信量の規制について。

VCI起動時に最大RPSが30~60RPS程のを対策するついでに調査開始。

日付が変わるたびに
 ・各DB参照
 ・日の出日の入り、月の出月の入り計算(複数地点)
 ・旧暦計算
 ・黄道計算
 ・24節季計算
 ・カレンダー更新
 ・テキスト更新
等々処理が走るので、どれが重いのか特定がめんd・・大変そうなので腰が重かった。
(ちな最大RPSは3~15程度には減った)

〇いったいどこが重いんだ

やることと言ったら実は簡単、それぞれの処理の前と処理後にos.time()で時間を取得して、
経過する時間を計測して何が重たいのか地道に探すだけ。

なんで各DBからの読み込みに 0.1~0.4秒 くらいかかっているのか、モジュールが悪いのか?
配列にデータをセットして参照しているだけなのに・・・・
配列に・・・・セットして・・・・・・・・・・?????

あっ

〇愚かな私をお許しください

DB構造を見やすく管理できるよう event[月][日][番号] というデータ構造にしていました。

--main.luaの一部
    for i=1 ,15 do
        event_db[i]=event_DB.event_db(tonumber(month),tonumber(day),i)
        if event_db[i]~="" then
            event_db[i]=" ・"..font_size_event(event_db[i],0.3,30)
            event_text=event_text..event_db[i].."\n".."<size=0.02>\n</size>"
        else
            event_db[i]=""
            break
        end
    end
--モジュールの一部
local function event_db(m,d,no)

    local event={}
    for i=1,12 do
        event[i]={}
        for ii=1,31 do
            event[i][ii]={}
        end
    end

    event[1][1][1]="1801年:小惑星『ケレス』発見。初の小惑星発見とされる"
    event[1][1][2]="1863年:リンカーン大統領が『奴隷解放宣言』布告"
    event[1][1][3]="1945年:東京に簡易電話所『公衆電話』新設"
    event[1][1][4]="1963年:日本初の30分テレビアニメ『鉄腕アトム』放映開始"
    event[1][1][5]="1983年:ARPANETがInternetProtocol『IP』に切り替え"
    ~~~~~中略~~~~~
    return event[m][d][no]
end

はい、main.luaから特定の日の1~15番のデータを取得するたびに、
配列の初期化と366日×15個の配列セットを15回も処理していました。
重いわけだよ・・

〇仮対策

こんな処理ばれる前に消さないとすぐに対策しないと。
本対策は時間がかかりそうなので、ひとまずモジュールを読み込んだ際に配列をセット

    local event={}
    for i=1,12 do
        event[i]={}
        for ii=1,31 do
            event[i][ii]={}
        end
    end

    event[1][1][1]="1801年:小惑星『ケレス』発見。初の小惑星発見とされる"
    event[1][1][2]="1863年:リンカーン大統領が『奴隷解放宣言』布告"
    event[1][1][3]="1945年:東京に簡易電話所『公衆電話』新設"
    event[1][1][4]="1963年:日本初の30分テレビアニメ『鉄腕アトム』放映開始"
    event[1][1][5]="1983年:ARPANETがInternetProtocol『IP』に切り替え"
    ~~~~~中略~~~~~
    end

DBを参照するときは↓だけ実行するように変更。

local function event_db(m,d,no)
    return event[m][d][no]
end

VCI読み込み時が重いのは変わらないけどカクツキは減った。

〇本対策

366日×15個のデータを配列に入れるだけでもLua的には処理が重たいようだ。
ではどうしよう?

そうだね、IFで引っ掛けるしかないよね(ほかの方法あれば教えて)。
ということでこうなりました。

local function event_db(m,d)
    if m==1 then
        if d==1 then    --1月1日
            event={
                    "1801年:小惑星『ケレス』発見。初の小惑星発見とされる",
                    "1863年:リンカーン大統領が『奴隷解放宣言』布告",
                    "1945年:東京に簡易電話所『公衆電話』新設",
                    "1963年:日本初の30分テレビアニメ『鉄腕アトム』放映開始",
                    "1983年:ARPANETがInternetProtocol『IP』に切り替え",
                    "2006年:『三菱東京UFJ銀行』発足",
                    "2010年:『日本年金機構』発足",
                    "2019年:統計開始以来史上最速となる『台風1号』発生",
                    "2024年:石川県能登地方でM7.6の地震。大津波警報、津波警報が発令",
                    "",
                    "",
                    "",
                    "",
                    "",
                    ""}
        elseif d==2 then    --1月2日
            event={
                    "1586年:徳川 家康の重臣『石川 数正』豊臣 秀吉のもとに出奔",
                    "1904年:報知新聞に日本初の『新聞写真』掲載",
                ~~~~~中略~~~~~
        end
    end
    return event
end                

これによりDB読み込みは0.01秒以下(もっと減ってるはずだけど忘れた)になりました。
めでたしめでたし。

蛇足

配列が悪いというよりデータ量が多すぎるのと、
頻繁に更新するであろうと考えて見やすさ重視過ぎたのが悪かったのかもしれません。

ちなみに絶対管理大変なことになると思っていたので作成当初からエクセルしてました。
(エクセルでif構造作るのが大変で、配列のほうが簡単だったからというのもあったかも?)

↓当初のDB
DB1.jpg

↓最新のDB
DB2.jpg

みんなも気をつけようね・・・・私だけかもしれないけど。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?