質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.61%

  • Python 3.x

    5949questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • SQLite

    605questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • Bottle

    54questions

    Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

sqlite:ローカルホストの起動時に、DBをinmemoryに全て読み込む方法は問題ありませんか

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 280

qwdcf_mag

score 34

 概要

ローカルホスト(python-bottle)を使ったDBのソフトウェアを作っています。
データベースはsqliteを使用しています。
sqliteファイルは事情により複数に分かれていますので(これは前提でお願いします)、それを仮想的に結合させて1個のDBのように扱っています。

あまり経験がなく悩んだのですが、あれこれ考えた末、inmemoryの機能を使って、ひとまず各ファイルのテーブルを寄せ集めてくることにしました。

簡略化したサンプルを示します。

        conn=sqlite3.connect(":memory:")
        conn.row_factory = sqlite3.Row
        c=conn.cursor()

        sql="create table datas (id integer,data text,created_at text)"
        c.execute(sql)

        #複数dbからデータを集めてくる
        paths=[dbパスのリスト]

        for path in paths:
            with closing(sqlite3.connect(path)) as conn2:
                conn2.row_factory = sqlite3.Row
                c2=conn2.cursor()
                ~SELECTしてデータを寄せ集め、paraを作る~

        #インメモリDBにインサートする
        sql_insert = "insert into datas values(?)"
        c.executemany(sql_insert1,para)

 起動時に読み込み

最初は以上の寄せ集めプロセスを毎回実行していたのですが、途中で「inmemoryはサーバー起動中ずっと維持できるのでは?」と思ったため、@routeよりも前に書いてみたところ、それでも一応正常に動いています。

現状では以下のようなコードになっています。

class MakeMemoryDB():

    def __init__(self,paths):

        conn=sqlite3.connect(":memory:")
        conn.row_factory = sqlite3.Row
        c=conn.cursor()

        sql="create table datas (id integer,data text,created_at text)"
        c.execute(sql)

        #複数dbからデータを集めてくる
        paths=[dbパスのリスト]

        for path in paths:
            with closing(sqlite3.connect(path)) as conn2:
                conn2.row_factory = sqlite3.Row
                c2=conn2.cursor()
                ~SELECTしてデータを寄せ集め、paraを作る~

        #インメモリDBにインサートする
        sql_insert = "insert into datas values(?)"
        c.executemany(sql_insert1,para)

        self.conn=conn



M=MakeMemoryDB(dbpath)

@route('/hello')
def hello():
    conn=M.conn
    c=conn.cursor()
    ~select実行~


    return  data    #ここでインメモリDBは閉じずに維持される模様(現状では大丈夫だが不安)

 質問

今のところ正常に動作しているように見えます。また、速度もテストしてみたところ、クエリの実行時間も、ディスクから実行するときのおよそ半分ほどで済みました。

ただ、こういう使い方を聞いたことがないのと、以前こちらで質問させてもらった際に、こういう用法はなかったように思います。
https://teratail.com/questions/121729

果たしてこれで問題が無いのか不安があります。そこで質問なのですが、

1 以上の方式で何か問題が起きてくる可能性はないでしょうか(思わぬところで正常に動作しない、DBが閉じてしまうなど)
2 classを作って、connを作る方法をとっていますが、DB接続としてこのやり方に問題はないでしょうか。
3 その他気をつける点や改良すべき点はないでしょうか。

独学で経験も少ないため、判断が難しいです。
ご指導よろしくお願いいたします。

追記

データベースファイルが複数あることが不合理に見える思いますが、背景があり、諸々検討の上での既定事項ですので、その点は前提にしていただけるようお願いいたします。質問者の主関心はインメモリの動作具合にあります。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

DBのデータ件数が多くなってきてメモリに収まらなくなったらどーなるか、
DBの読み込みだけで数十分かかるようになればどーなるか、
そのソフトが起動中に更新されたデータは処理できないとか、

まあ、ここらへんが問題にならないならそんでいいでしょうね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/04 12:51

    ありがとうございます。いずれもクリアできそうではあるのですが、ちなみにメモリに収まらない件数(データサイズ)というのはどのくらいになるのでしょうか。

    キャンセル

  • 2018/05/04 13:10

    pythonが扱う事ができるデータサイズがどれだけかというのは、ちとわかりませんが、
    そこらへんの心配があるなら、検証の必要はあるんじゃないかとおもいます

    キャンセル

  • 2018/05/04 13:17

    相場観がよくわからないのですが、たとえば100MB程度では問題になりますか?

    キャンセル

  • 2018/05/04 13:23

    100Mぐらいなら問題はなさそうですが、そこらへんは実際に検証してみましょう。

    この件でトラブった時に、どこの誰かもわからんやつにこう言われたから私に責任はありません、と上司に言って納得してくれると言うなら、べつにかまいませんが

    キャンセル

  • 2018/05/07 16:33

    ありがとうございました。実験したところ、1GBで特に問題は起きませんでした。

    キャンセル

0

3 その他気をつける点や改良すべき点はないでしょうか

... 
sqliteファイルは事情により複数に分かれていますので(これは前提でお願いします)、それを仮想的に結合させて1個のDBのように扱っています。 
...

まず、このことを解決するべきと思います。

メモリーに読み込んだ結果を DB に保存してやり、つぎからはその Table を普通につかうようにすればいいのでは?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/07 16:34

    ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python 3.x

    5949questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • SQLite

    605questions

    SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

  • Bottle

    54questions

    Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。