LibreOffice(58)SDKからメソッドの解説を抽出:辞書をディスクに保存する

ラベル: ,

前の関連記事:LibreOffice(57)SDKからメソッドの解説を抽出する


Python(25)実行時間を計測する方法で実行時間の測定方法がわかったので、コードを書き換えて比較してみます。さらに生成した辞書をshelveモジュールを使ってディスクに保存して再利用できるようにします。

fileinputを使うのをやめてファイル名の昇順で処理する


(2014.8.10追記。以下の実行時間測定は1回やると読み込んだファイルの情報がどこかにキャッシュされるのかかなり速くなっています。時間を置いてやってみると47.252334046827905秒もかかりました。)

読み込むファイル単位で処理が完結するのならfileinputを使うメリットを感じないので使用をやめることにします。

まずはLibreOffice(57)SDKからメソッドの解説を抽出するで作ったfileinputを使ったものの実行時間を計測します。

libreoffice58.py 3.958212946519107秒。

fileinputの使用はやめてfor文でglobで得たファイルリストを開いたものが以下。

libreoffice58.py 3.550348988340234秒。

ちょっと時間が縮まりましたね。誤差の範囲かもしれませんけど。

ファイル名を昇順で取得するようにしてa03687.htmlより大きい数字のファイル以降は処理しないようにしました。

libreoffice58.py 2.917427166490551秒。

dbmモジュールを追加してshelveで生成した辞書をディスクに保存する


3秒程度で辞書の生成が終了するのならわざわざディスクに保存しておかなくてもよいかもしれませんが、毎回SDKのhtmlファイルから生成するのも無駄ですので生成した辞書をディスクに保存することにします。

12.3. shelve — Python オブジェクトの永続化 — Python 3.3.5 ドキュメント

Pythonのshelveを使おうと思ったのですが、データベースファイルを開こうとするとdbmモジュールがないと言われます。

C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib\shelve.pyの215行目でimport dbmと書いてあるのですが、dbm.pyが見当たりません。

LibreOffice(30)PythonのSQLiteモジュールを導入でもSQLiteモジュールがありませんでしたが、LibreOffice付属のPythonではデータベース関係のモジュールは削除してあるようです。

SQLiteの時と同様にオリジナルのPythonからもってくることにします。

LibreOffice(29)Pythonインタプリタの置き換えは断念と同様にして32bit版Python3.3.5をインストールします。

インストールしたPython33フォルダを他の場所にコピーしたらPython3.3.5はアンインストールします。

Python33フォルダのLibフォルダにあるdbmフォルダをC:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\libへコピーしました。

これだけでshelveが使えるようになりました。

libreoffice58.py 3.0223486369297894秒。

これを実行すると実行したpyファイルと同じフォルダにdic_IDL.db.bakdic_IDL.db.datdic_IDL.db.dirの3つのファイルが生成されました。

dic_IDL.db.datファイルは2.5MBあります。他の2つのファイルは1KBです。
# -*- coding: utf-8 -*-
def dic_IDL_open():
    import shelve  # Pythonオブジェクトをディスクに保存するshelveモジュール。
    from contextlib import closing  # withでdbファイルを開いたときに閉じるためのモジュール。
    with closing(shelve.open("dic_IDL.db", flag='r')) as d:  # 読み込み専用でdbファイルを開く。
        dic_idl_html = d["dic_idl_html"]
        dic_memItem_html = d["dic_memItem_html"]
        dic_memItem_mdesc = d["dic_memItem_mdesc"]
if __name__ == "__main__":
    dic_IDL_open()
これでディスクに保存した辞書が呼び出せました。

libreoffice58.py

メンバーアイテムの記述があるIDLのみhtmlファイルを取り込んでいましたが、気が変わってすべて取り込むようにしました。

参考にしたサイト


12.3. shelve — Python オブジェクトの永続化 — Python 3.3.5 ドキュメント
LibreOffice4.2バンドル版Pythonでshelveを使うにはdbmモジュールを追加しないといけません。

12.1.2. データストリームの形式
shelveではプロトコルバージョン 3がデフォルトになります。

shelve – 任意の Python オブジェクトの永続ストレージ - Python Module of the Week
shelveの具体的な使い方の例があります。

次の関連記事:LibreOffice(59)htmlファイルにSDKへのリンクをつける

PR

0 件のコメント:

コメントを投稿