pytho****@googl*****
pytho****@googl*****
2011年 3月 19日 (土) 16:45:18 JST
Revision: f60b758de537 Author: MATSUI Tetsushi <matsu****@gmail*****> Date: Sat Mar 19 00:44:16 2011 Log: 2.6.6: library/shelve http://code.google.com/p/python-doc-ja/source/detail?r=f60b758de537 Modified: /library/shelve.rst ======================================= --- /library/shelve.rst Thu May 27 10:51:58 2010 +++ /library/shelve.rst Sat Mar 19 00:44:16 2011 @@ -1,4 +1,3 @@ - :mod:`shelve` --- Python オブジェクトの永続化 ============================================= @@ -27,22 +26,37 @@ .. versionchanged:: 2.3 *protocol* パラメタが追加されました。 - デフォルトでは、永続的な辞書の可変エントリに対する変更をおこなっても、自 動的にファイルには書き戻されません。オプションの *writeback* パラメタが - *True* に設定されていれば、アクセスされたすべてのエントリはメモリ上にキ ャッシュされ、ファイルを閉じる際に書き戻されます; - この機能は永続的な辞書上の可変の要素に対する変更を容易にしますが、多数の エントリがアクセスされた場合、膨大な量のメモリがキャッシュの - ために消費され、アクセスされた全てのエントリを書き戻す (アクセスされたエ ントリが可変であるか、あるいは実際に変更されたかを決定する方法は存在しないの です) + Python の意味論から、シェルフには永続的な辞書の可変エントリに対する変更 を知る術が + ありません。デフォルトでは、変更されたオブジェクトはシェルフに代入された とき + *だけ* 書き込まれます (:ref:`shelve-example` 参照)。 + オプションの *writeback* パラメタが *True* に設定されていれば、 + アクセスされたすべてのエントリはメモリ上にキャッシュされ、 + :meth:`~Shelf.sync` および :meth:`~Shelf.close` を呼び出した際に書き戻さ れます。 + この機能は永続的な辞書上の可変の要素に対する変更を容易にしますが、 + 多数のエントリがアクセスされた場合、膨大な量のメモリがキャッシュの + ために消費され、アクセスされた全てのエントリを書き戻す + (アクセスされたエントリが可変であるか、 + あるいは実際に変更されたかを決定する方法は存在しないのです) ために、ファイルを閉じる操作を非常に低速にしてしまいます。 - -shelve オブジェクトは辞書がサポートする全てのメソッドをサポートしています。 これにより、辞書ベースのスクリプトから永続的な記憶媒体を必要とする + +シェルフオブジェクトは辞書がサポートする全てのメソッドをサポートしていま す。 +これにより、辞書ベースのスクリプトから永続的な記憶媒体を必要とする スクリプトに容易に移行できるようになります。 -もう一つ追加でサポートされるメソッドがあります。 - +追加でサポートされるメソッドが二つあります: .. method:: Shelf.sync() - シェルフが *writeback* を *True* にセットして開かれている場合に、キャッ シュ中の全てのエントリを書き戻します。また容易にできるならば、 - キャッシュを空にしてディスク上の永続的な辞書を同期します。このメソッドは シェルフを :meth:`close` によって閉じるとき自動的に呼び出されます。 + シェルフが *writeback* を :const:`True` にセットして開かれている場合に、 + キャッシュ中の全てのエントリを書き戻します。また容易にできるならば、 + キャッシュを空にしてディスク上の永続的な辞書を同期します。 + このメソッドはシェルフを :meth:`close` によって閉じるとき自動的に呼び出 されます。 + +.. method:: Shelf.close() + + 永続的な *辞書* オブジェクトを同期して閉じます。 + 既に閉じられているシェルフに対して呼び出すと :exc:`ValueError` + に終わります。 .. seealso:: @@ -68,11 +82,7 @@ が使われた場合 (不幸なことに) その制約に縛られます --- これはデータベース に記録されたオブジェクト (の pickle 化された表現) はかなり小さく なければならず、キー衝突が生じた場合に、稀にデータベースを更新することが できなくなるということを意味します。 -* 実装に依存して、永続化した辞書を閉じるときには、変更がディスクに書き込ま れるかもしれないし、必ずしも書き込まれないかもしれません。 - :class:`Shelf` クラスの :meth:`__del__` メソッドは :meth:`close` - メソッドを呼び出すので、プログラマは通常この作業を明示的に行う必要はあり ません。 - -* :mod:`shelve` モジュールは、シェルフに置かれたオブジェクトの * 並列した* 読み出し/書き込みアクセスをサポートしません +* :mod:`shelve` モジュールは、シェルフに置かれたオブジェクトの *並列した* 読み出し/書き込みアクセスをサポートしません (複数の同時読み出しアクセスは安全です)。あるプログラムが書き込みために開 かれたシェルフを持っているとき、他のプログラムは そのシェルフを読み書きのために開いてはいけません。この問題を解決するため に Unix のファイルロック機構を使うことができますが、この機構は Unix のバージョン間で異なり、使われているデータベースの実装について知識が必要 となります。 @@ -95,21 +105,30 @@ .. class:: BsdDbShelf(dict[, protocol=None[, writeback=False]]) - :class:`Shelf` のサブクラス で、 :meth:`first` 、 :meth:`next` 、 :meth:`previous` 、 - :meth:`last` および :meth:`set_location` メソッドを公開しています。これ らのメソッドは :mod:`bsddb` - モジュールでは利用可能ですが、他のデータベースモジュールでは利用できませ ん。コンストラクタに渡された *dict* オブジェクトは上記のメソッドを - サポートしていなくてはなりません。通常 は、 :func:`bsddb.hashopen` 、 :func:`bsddb.btopen` または - :func:`bsddb.rnopen` のいずれかを呼び出して得られるオブジェクトが条件を 満たしています。オプションの *protocol* 、および - *writeback* パラメタは :class:`Shelf` クラスにおけるパラメタと同様に解釈 されます。 + :class:`Shelf` のサブクラスで、 :meth:`first`, :meth:`!next`, + :meth:`previous`, :meth:`last`, :meth:`set_location` + メソッドを公開しています。これらのメソッドは :mod:`bsddb` + モジュールでは利用可能ですが、他のデータベースモジュールでは利用できませ ん。 + コンストラクタに渡された *dict* オブジェクトは上記のメソッドを + サポートしていなくてはなりません。通常は、 :func:`bsddb.hashopen`, + :func:`bsddb.btopen` または :func:`bsddb.rnopen` + のいずれかを呼び出して得られるオブジェクトが条件を満たしています。 + オプションの *protocol* および *writeback* パラメタは + :class:`Shelf` クラスにおけるパラメタと同様に解釈されます。 .. class:: DbfilenameShelf(filename[, flag='c'[, protocol=None[, writeback=False]]]) - :class:`Shelf` のサブクラスで、辞書様オブジェクトの代わりに *filename* を受理します。根底にあるファイルは - :func:`anydbm.open` を使って開かれます。デフォルトでは、ファイルは読み書 き可能な状態で開かれます。オプションの *flag* パラメタは - :func:`open` 関数におけるパラメタと同様に解釈されます。オプションの *protocol* 、および *writeback* パラメタは + :class:`Shelf` のサブクラスで、辞書様オブジェクトの代わりに + *filename* を受理します。根底にあるファイルは + :func:`anydbm.open` を使って開かれます。 + デフォルトでは、ファイルは読み書き可能な状態で開かれます。 + オプションの *flag* パラメタは :func:`.open` + 関数におけるパラメタと同様に解釈されます。 + オプションの *protocol* および *writeback* パラメタは :class:`Shelf` クラスにおけるパラメタと同様に解釈されます。 +.. _shelve-example: 使用例 ------ @@ -155,7 +174,8 @@ BSD ``db`` データベースインタフェース。 Module :mod:`dbhash` - :mod:`bsddb` をラップする薄いレイヤで、他のデータベースモジュールのよ うに関数 :func:`open` を提供しています。 + :mod:`bsddb` をラップする薄いレイヤで、 + 他のデータベースモジュールのように関数 :func:`~dbhash.open` を提供し ています。 Module :mod:`dbm` 標準の Unix データベースインタフェース。