2015-12-16 14 views
14

Używam Pythona/Pysam do analizy danych sekwencjonowania. W swoim tutorialu (pysam - An interface for reading and writing SAM files) dla wiązania polecenia jest napisane:Jak buforować odczyty?

"Ta metoda jest zbyt wolna dla przetwarzania o wysokiej przepustowości. Jeśli odczyt musi zostać przetworzony wraz z wiązaniem, pracuj z odczytaną nazwą posortowanego pliku lub, lepiej, z odczytów z pamięci podręcznej. "

Jak "pamięć podręczną czyta"?

Odpowiedz

9

Caching to typowe podejście do przyspieszenia długotrwałych operacji. Poświęca pamięć dla szybkości obliczeniowej.

Załóżmy, że masz funkcję, która przy danym zestawie parametrów zawsze zwraca ten sam wynik. Niestety ta funkcja jest bardzo powolna i trzeba ją nazwać znaczną ilość razy spowalniając program.

Co można zrobić, to przechowywanie ograniczonej ilości kombinacji {parameters: result} i pomijanie jej logiki za każdym razem, gdy funkcja jest wywoływana z tymi samymi parametrami.

To brudna sztuczka, ale dość skuteczna, szczególnie jeśli kombinacja parametrów jest niska w porównaniu do prędkości funkcji.

W Pythonie 3 istnieje do tego celu decorator.
W języku Python 2 a library może pomóc, ale potrzebujesz trochę więcej pracy.

3

AlignmentFile bierze jako pierwszy argument:

filepath_or_object

Więc zamiast dostarczania pliku, można dostarczać do obiektu, który obsługuje interfejs plikopodobny, czyli metod seek, read , tell. Podczas implementacji klasy można również zaimplementować buforowanie na odczytach, które oczywiście muszą zależeć od aktualnej pozycji kursora.

Jeśli rozmiar pliku jest na tyle mały, że mieści się w pamięci, można zapoznać się z pełną dokumentacją i operować na obiekcie io.BytesIO, nie ma potrzeby, aby utworzyć własną klasę:

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

nie jestem pewien, że ten przyspieszy to znacznie, ponieważ zakładam, że nowoczesne systemy operacyjne (i wiem, że to zrobi Linux) wykonają dostęp do pliku cache. Więc może wystarczy na tym polegać.

Powiązane problemy