python/pysam を使用してシーケンス データを分析しています。コマンドmateのチュートリアル(pysam - SAMファイルを読み書きするためのインターフェース)では、次のように述べています。
'この方法は、ハイスループット処理には遅すぎます。読み取りをそのメイトで処理する必要がある場合は、読み取り名でソートされたファイルから作業するか、キャッシュ読み取りを使用することをお勧めします。
どのように「読み取りをキャッシュ」しますか?
python/pysam を使用してシーケンス データを分析しています。コマンドmateのチュートリアル(pysam - SAMファイルを読み書きするためのインターフェース)では、次のように述べています。
'この方法は、ハイスループット処理には遅すぎます。読み取りをそのメイトで処理する必要がある場合は、読み取り名でソートされたファイルから作業するか、キャッシュ読み取りを使用することをお勧めします。
どのように「読み取りをキャッシュ」しますか?
キャッシングは、長時間実行される操作を高速化するための一般的なアプローチです。計算速度のためにメモリを犠牲にします。
与えられたパラメーターのセットが常に同じ結果を返す関数があるとします。残念ながら、この関数は非常に遅く、かなりの回数呼び出す必要があり、プログラムの速度が低下します。
あなたができることは、限られた量の {parameters: result} の組み合わせを保存し、関数が同じパラメーターで呼び出されるたびにそのロジックをスキップすることです。
これは汚いトリックですが、特にパラメーターの組み合わせが関数の速度に比べて低い場合に非常に効果的です。
Python 3 には、この目的のためのデコレータがあります。
Python 2 ではライブラリが役立ちますが、もう少し作業が必要です。
AlignmentFile は最初の引数として次の値を取ります。
filepath_or_object
したがって、ファイル名を指定する代わりに、ファイルのようなインターフェースをサポートするオブジェクト、つまりメソッドseek、read、 を指定できtellます。このためのクラスを実装する場合、もちろん現在のカーソル位置に依存する必要がある読み取りにキャッシュを実装することもできます。
ファイルサイズがメモリに収まるほど小さい場合は、ファイル全体を読み取ってio.BytesIOオブジェクトを操作できます。独自のクラスを作成する必要はありません。
data = io.BytesIO(open('datafile','rb').read())
your_object = AlignmentFile(data, <other args>)
最新のオペレーティングシステム(Linuxがそうすることがわかっている)がキャッシュファイルアクセスを行うと想定しているため、これで速度が大幅に向上するかどうかはわかりません。ですから、それを頼りにするだけで十分なのかもしれません。