2015-12-16 15 views
14

Ich benutze Python/Pysam, um Sequenzierungsdaten zu analysieren. In seinem Tutorial (pysam - An interface for reading and writing SAM files) für den Befehl Mate heißt es:Wie kann ich Lesevorgänge zwischenspeichern?

'Diese Methode ist zu langsam für die Verarbeitung mit hohem Durchsatz. Wenn ein Lesevorgang mit seinem Partner verarbeitet werden muss, arbeiten Sie von einer nach Lese-Namen sortierten Datei oder, besser, Cache-Lesevorgänge.

Wie würden Sie 'cache reads'?

Antwort

9

Caching ist ein typischer Ansatz zur Beschleunigung lang andauernder Operationen. Es opfert Speicher wegen der Rechengeschwindigkeit.

Nehmen wir an, Sie haben eine Funktion, die bei einer Reihe von Parametern immer das gleiche Ergebnis liefert. Leider ist diese Funktion sehr langsam und Sie müssen es eine beträchtliche Anzahl von Zeiten nennen, die Ihr Programm verlangsamen.

Sie können eine begrenzte Anzahl von {parameters: result} -Kombinationen speichern und die Logik überspringen, wenn die Funktion mit denselben Parametern aufgerufen wird.

Es ist ein schmutziger Trick, aber ziemlich effektiv, besonders wenn die Parameterkombination im Vergleich zur Funktionsgeschwindigkeit niedrig ist. In Python 3 gibt es einen decorator für diesen Zweck.
In Python 2 kann ein library helfen, aber Sie brauchen ein bisschen mehr Arbeit.

3

AlignmentFile nimmt als erstes Argument:

filepath_or_object

Anstatt also einen Dateinamen zu versorgen, können Sie ein Objekt liefern, die eine dateiähnliche Schnittstelle unterstützt, dh die Methoden seek, read , tell. Wenn Sie eine Klasse dafür implementieren, können Sie auch Caching für die Lesevorgänge implementieren, die natürlich von der aktuellen Cursorposition abhängen müssen.

Wenn Dateigröße klein genug ist, so dass es in den Speicher passt, können Sie die komplette Datei lesen und arbeiten auf einem io.BytesIO Objekt, keine Notwendigkeit, eine eigene Klasse zu machen:

data = io.BytesIO(open('datafile','rb').read()) 
your_object = AlignmentFile(data, <other args>) 

Ich bin nicht sicher, dass diese wird die Dinge viel beschleunigen, weil ich annehme, dass moderne Betriebssysteme (ich weiß, Linux wird das tun) Cache-Dateizugriff. Vielleicht ist es genug, darauf zu vertrauen.