2016-09-29 9 views
6

pythonファイルハンドルをキャッシュする方法はありますか?私はnetCDFファイルパスを入力として受け取り、それを開き、netCDFファイルからいくつかのデータを抽出し、それを閉じる関数を持っています。それは何度も呼び出され、毎回ファイルを開く際のオーバーヘッドが高い。PythonのnetCDFファイルへのキャッシュファイルのハンドル

ファイルハンドルをキャッシュするほうが速いのですが、どうすればいいですか?おそらくこれを行うためのPythonライブラリがあります

+0

あなたが開いているファイルを保存して、関数の引数としてファイルオブジェクトを送信できませんか? – kakk11

答えて

3

はい、あなたが使用することができます。

はのは一例に従ってみましょう。あなたが実行している場合今

# save.py - it puts deserialized file handler object to memcached 
import dill 
import memcache    


mc = memcache.Client(['127.0.0.1:11211'], debug=0) 
file_handler = open('data.txt', 'r') 
mc.set("file_handler", dill.dumps(file_handler)) 
print 'saved!' 

# read_from_file.py - it gets deserialized file handler object from memcached, 
#      then serializes it and read lines from it 
import dill 
import memcache 


mc = memcache.Client(['127.0.0.1:11211'], debug=0) 
file_handler = dill.loads(mc.get("file_handler")) 
print file_handler.readlines() 

:あなたは、2つのファイルを持っている

python save.py 
python read_from_file.py 

あなたが欲しいものを手に入れることができます。

なぜ機能するのですか?

ファイル(file_handler.close())を閉じなかったため、オブジェクトはメモリに残っています(weakrefのためにガベージコレクションされていません)。別のプロセスでさえ。

ソリューション

import dill 
import memcache 


mc = memcache.Client(['127.0.0.1:11211'], debug=0) 
serialized = mc.get("file_handler") 
if serialized: 
    file_handler = dill.loads(serialized) 
else: 
    file_handler = open('data.txt', 'r') 
    mc.set("file_handler", dill.dumps(file_handler)) 
print file_handler.readlines() 
-1

これはどう?

filehandle = None 
def get_filehandle(filename): 
    if filehandle is None or filehandle.closed(): 
     filehandle = open(filename, "r") 
    return filehandle 

あなたはfilehandle変数をいじってから他のコードを防ぐために、クラスにこれをカプセル化することもできます。 Pythonライブラリ以下