Как кэшировать чтения?
Я использую 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 сделает это) делают доступ к кеш файлу. Поэтому, возможно, этого достаточно, чтобы полагаться на это.