2011-12-07 15 views
1

大きなコードベースと異なるツールで複数の読み込みが必要な場合があります。 それで、テキストが変わらない間にディスクで何度も読むのは本当に浪費だと思ったので、私は次のように書きました。ディスクのキャッシュ操作

class Module(object): 
    def __init__(self, module_path): 
     self.module_path = module_path 
     self._text = None 
     self._ast = None 

    @property 
    def text(self): 
     if not self._text: 
      self._text = open(self.module_path).read() 
     return self._text 

    @property 
    def ast(self): 
     s = self.text # which is actually discarded 
     if not self._ast: 
      self._ast = parse(self.text) 

     return self._ast 


class ContentDirectory(object): 
    def __init__(self): 
     self.content = {} 

    def __getitem__(self, module_path): 
     if module_path not in self.content: 
      self.content[module_path] = Module(module_path) 

     return self.content[module_path] 

しかし、この新しいトリックを使用することができながら、私は、コードの残りの部分を変更しないようしたいと思いますので、今では、問題が来ます。

私が見る唯一の方法は、例えば "open"組み込み関数をどこでも使えるようにパッチすることです。

from myotherlib import __builtins__ as other_builtins 
other_builtins.open = my_dummy_open # which uses this cache 

しかし、実際には賢明な考えのようには見えません。 私はあきらめて、パフォーマンスが本当にあまりにも悪いかもしれないかどうか試してみてください。

+3

「私はあきらめ、パフォーマンスが多分本当にあまりにも悪い場合にのみ試みるべきでしょうか?」 - ほぼ確実にはい。 OSレベルでは、ファイルのキャッシュが処理されます。たとえば、OSよりもアクセスパターンをよく理解していればキャッシュできるだけの価値がありますが、実際に最初に実行する必要があるかどうかは常に確認する価値があります。 –

+0

'parse()'は実際にどれくらい時間がかかりますか?再解析を何回保存するのですか?あなたのプロセス/コンピュータは、 '_ast'が実際には使用されているが使用されていないメモリを使って、もっと便利なことをすることができますか? – sarnold

+0

OSは奇跡を起こすことはできません。小さなテストでは、キャッシュされたバージョンとキャッシュされていないバージョンの間に大きな違いがあります。 –

答えて

1

このライブラリによって提供される機能がご使用のシナリオで使用されているかどうかはわかりませんが、linecache libraryの存在にもかかわらず考えられます。リンクドキュメントから:

linecacheモジュールは、内部的に最適化しようとするとキャッシュ、多くの行が単一のファイルから読み込まれ、共通のケースを使用しながら1は、任意のファイルから任意の行を取得することができます。

...もちろん、これはエレガントかつ透明な方法でソリューションを実装の問題にも、近くに来ない...

2

システムopen()コールを交換すると、潜在的に悪いことです。それはあなたが期待どおりにopen()を使用するすべてを使用する必要があります。

なぜコードを変更しないようにしたいですか?

はい、パフォーマンスを測定し、それが価値があるかどうかを確認します。たとえば、上記のコードを入力して、どれくらい高速なものがあるかを確認します。 1%の速さであれば何もする必要はありません。それがはるかに速ければ、open()を使用しているものを見て、できればそのコードを変更してください。

ところで、LRU cache(Python 3.2のfunctoolsの一部)のようなものもあなたの仕事に役立ちます。

関連する問題