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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Bottle

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

SQLite

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

Python 3.x

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

Q&A

解決済

2回答

1868閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Bottle

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

SQLite

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

Python 3.x

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

1グッド

1クリップ

投稿2018/05/04 01:27

編集2018/05/04 03:32

概要

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

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

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

python

1 conn=sqlite3.connect(":memory:") 2 conn.row_factory = sqlite3.Row 3 c=conn.cursor() 4 5 sql="create table datas (id integer,data text,created_at text)" 6 c.execute(sql) 7 8 #複数dbからデータを集めてくる 9 paths=[dbパスのリスト] 10 11 for path in paths: 12 with closing(sqlite3.connect(path)) as conn2: 13 conn2.row_factory = sqlite3.Row 14 c2=conn2.cursor() 15 ~SELECTしてデータを寄せ集め、paraを作る~ 16 17 #インメモリDBにインサートする 18 sql_insert = "insert into datas values(?)" 19 c.executemany(sql_insert1,para) 20

起動時に読み込み

最初は以上の寄せ集めプロセスを毎回実行していたのですが、途中で「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 その他気をつける点や改良すべき点はないでしょうか。

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

追記

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

tachikoma👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

投稿2018/05/04 03:31

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/04 03:51

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

2018/05/04 04:10

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

退会済みユーザー

2018/05/04 04:17

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

2018/05/04 04:23

100Mぐらいなら問題はなさそうですが、そこらへんは実際に検証してみましょう。 この件でトラブった時に、どこの誰かもわからんやつにこう言われたから私に責任はありません、と上司に言って納得してくれると言うなら、べつにかまいませんが
退会済みユーザー

退会済みユーザー

2018/05/07 07:33

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

0

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

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

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

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

投稿2018/05/04 03:03

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/07 07:34

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問