pythonファイルハンドルをキャッシュする方法はありますか?私はnetCDFファイルパスを入力として受け取り、それを開き、netCDFファイルからいくつかのデータを抽出し、それを閉じる関数を持っています。それは何度も呼び出され、毎回ファイルを開く際のオーバーヘッドが高い。PythonのnetCDFファイルへのキャッシュファイルのハンドル
ファイルハンドルをキャッシュするほうが速いのですが、どうすればいいですか?おそらくこれを行うためのPythonライブラリがあります
pythonファイルハンドルをキャッシュする方法はありますか?私はnetCDFファイルパスを入力として受け取り、それを開き、netCDFファイルからいくつかのデータを抽出し、それを閉じる関数を持っています。それは何度も呼び出され、毎回ファイルを開く際のオーバーヘッドが高い。PythonのnetCDFファイルへのキャッシュファイルのハンドル
ファイルハンドルをキャッシュするほうが速いのですが、どうすればいいですか?おそらくこれを行うためのPythonライブラリがあります
はい、あなたが使用することができます。
はのは一例に従ってみましょう。あなたが実行している場合今
# 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()
これはどう?
filehandle = None
def get_filehandle(filename):
if filehandle is None or filehandle.closed():
filehandle = open(filename, "r")
return filehandle
あなたはfilehandle
変数をいじってから他のコードを防ぐために、クラスにこれをカプセル化することもできます。 Pythonライブラリ以下
あなたが開いているファイルを保存して、関数の引数としてファイルオブジェクトを送信できませんか? – kakk11