Published Date : 2019年5月2日19:36
# またまた何回目なのよ!のドライブマウント。
from google.colab import drive
drive.mount('/content/drive')
# 前回のフォルダに民族大移動 cd drive/'My Drive'/data # 移動後、中身を確認。 ls -al

# 前回、塩漬けにしたピックルオブジェクトをご開封
# 諸事情によりPython標準のPickleモジュールをDillの代わりに使う。
import pickle
# 簡単な正規表現でファイルを指定して、取り出せる便利なやつ、glob。
import glob
markov_model_path=glob.glob('./*_model.pkl')

!pip install markovify
# マルコフモデルを読めるようにしなければならないので、インポート
import markovify
# 後でSQLiteに格納したのち、
# # また取り出すため関数にしておく。
def load_pickles(pkl_path):
with open(pkl_path,'rb') as f:
model_obj=pickle.load(f)
return model_obj
# マルコフモデルを一つずつ取り出し、リストにする。
# 実行時間約6秒
mm_models=[load_pickles(path_) for path_ in markov_model_path]
# sqlite3 を扱うためにインポート import sqlite3 # データベースの名前を決める。 # 好きな名前をつけてね。 dbname = 'mmblog_markov_model.sqlite3' # 後楽園でデータベースと握手! conn = sqlite3.connect(dbname) # データベースを操作できるようにするよ! c = conn.cursor() # エクセルシートみたいなものを作るよ! # そのための命令文だけ文字列にしておくよ。 create_sql = "create table markovmodels (id integer, name text, blog_model)" # エクセルシートみたいなものを作るよ! c.execute(create_sql) # 戦いの前のセーブをするよ! conn.commit() # 一旦ゲーム中断するよ! conn.close()

# ファイルを圧縮してくれるヤツだよ!
import bz2
# みんな大好きOSモジュールだよ!
import os
# 関数の時間だ!こらぁ!
# !?
# # ピックルして瓶に蓋をしてツメツメする関数だよ!
def pickle_to_zip(obj):
# 3 は圧縮率
# 9まであり、高ければ高圧縮
return bz2.compress(pickle.dumps(obj, PROTOCOL), 3)
# !?
# # ピクルスの瓶を開けてお皿に並べる関数だよ!
def zip_to_pickle(b):
# 解凍して、ピックルからオブジェクトにして返す。
return pickle.loads(bz2.decompress(b))
# なんでプロトコルだって?んああ、おっしゃらないで。 # # 気に入ったのは、以下の長い説明だけだ! # ここで、プロトコルバージョンをもっとも高く設定しているのは # # プロトコルバージョンが低いと、対応するPythonバージョンも低い。 # # # つまり、Pythonバージョンと共に歩んできたPickleの進化によって # # # # 便利になった部分や圧縮率の恩恵が得られない。 # # # # # なので、もっとも「自分のPythonで利用できるもっとも高いプロトコル」を選択するようにしています。 PROTOCOL = pickle.HIGHEST_PROTOCOL
# 後で取り出しやすくするため、
# モデルの名前を把握する。
model_names = [path_.split('_')[0] for path_ in markov_model_path]
# 一旦終了したゲームを再開するように、
# SQLiteデータベースに再アクセス。
conn = sqlite3.connect(dbname)
c = conn.cursor()
# IDと、モデル名、圧縮ピックルを
# データベースに入れていけという命令文を作る。
# (?,?,?)これはプレースホールダーといって、
# 場所を仮で確保しておくことができるよ。
# 明日花見がしたいからプレースホールダー(?,?,?)三人衆。
insert_sql = "insert into markovmodels (id, name, blog_model) values (?,?,?)"
# 実行時間21秒
# さっき作ったピックルにして圧縮する関数を併用して、
# インデクス番号+1でIDに、モデルの名前と、モデルを
# タプルのリストにして、インサートするオブジェクトにするよ!
insert_objs = list(zip(list(range(1,len(model_names)+1)), model_names, [pickle_to_zip(mmm) for mmm in mm_models]))
# executemanyは一度にたくさん命令を実行してくれるよ!
# !?データベースにぶっこむよ!
c.executemany(insert_sql, insert_objs)
# コミット(結果を残すぜ!)するよ!
conn.commit()
# さっき作ってデータを入れた
# テーブル名から
# 全部の情報を抜き出す命令を作るよ!
select_sql = 'select * from markovmodels'
# 一行ずつ何が入っているか見てみるよ!
# 実行時間15秒
for row in c.execute(select_sql):
# さっき作った解凍する関数を使って
# 3列目、インデックス番号2、を
# オブジェクになおすよ!
print((row[0], row[1], zip_to_pickle(row[2])))
# 処理が終わったら面倒くさがらず
# データベースの電源を落とすよ!
conn.close()

# getsize()はファイルの容量をバイトで知らせてくれる。
all_size = sum([os.path.getsize(path_) for path_ in markov_model_path])
dbsize=os.path.getsize(dbname)
# キロバイト=1024バイトなので、それで計算。
f'{round(all_size/1024/1024)}MB'
f'{round(dbsize/1024/1024)}MB'

from google.colab import files
# ダウンロードしたいファイル名を指定するだけ。
files.download(f'{dbname}')
