Как кэшировать чтения?

Я использую python/pysam для анализа данных последовательности. В своем учебнике (pysam - интерфейс для чтения и записи файлов SAM) для команды mate он говорит:

'Этот метод слишком медленный для обработки с высокой пропускной способностью. Если чтение нужно обрабатывать с помощью его помощника, работайте с отсортированным файлом чтения или, лучше, с чтением кеша. '

Как вы будете читать кешировать?

Ответы

Ответ 1

Кэширование - типичный подход для ускорения длительных операций. Он жертвует память ради вычислительной скорости.

Предположим, что у вас есть функция, которая задает набор параметров, всегда возвращает тот же результат. К сожалению, эта функция очень медленная, и вам нужно называть ее значительным количеством замедлений вашей программы.

Что вы можете сделать, это хранить ограниченное количество комбинаций {parameters: result} и пропускать его логику при каждом вызове функции с теми же параметрами.

Это грязный трюк, но довольно эффективный, особенно если комбинация параметров низкая по сравнению с функциональной скоростью.

В Python 3 есть декоратор для этой цели.
В Python 2 библиотека может помочь, но вам нужно немного больше работы.

Ответ 2

AlignmentFile принимает в качестве первого аргумента:

filepath_or_object

Поэтому вместо подачи имени файла вы можете предоставить объект, который поддерживает файловый интерфейс, то есть методы seek, read, tell. При реализации класса для этого вы также можете реализовать кэширование на чтениях, которые, конечно, должны зависеть от текущей позиции курсора.

Если размер файла достаточно мал, чтобы он помещался в память, вы можете прочитать полный файл и работать с объектом io.BytesIO, не нужно создавать свой собственный класс:

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

Я не уверен, что это ускорит процесс, потому что я предполагаю, что современные операционные системы (я знаю, что Linux сделает это) делают доступ к кеш файлу. Поэтому, возможно, этого достаточно, чтобы полагаться на это.