Одновременное чтение большого файла - PullRequest
0 голосов
/ 23 января 2019

Я создаю конвейер python для работы с очень большими двоичными файлами (то есть, более 50 ГБ). Это файлы BAM, тип формата, используемый для представления геномов. Мой сценарий в настоящее время ограничен двумя очень дорогими в вычислительном отношении вызовами подпроцесса.

Эти две команды занимают ~ 80% времени вычислений при каждом запуске конвейера, поэтому мне нужно найти способ ускорить этот процесс. Они читают данные из того же файла. Я хотел бы знать лучший путь вперед, чтобы сделать это более эффективным. В принципе, есть ли конкретный вариант параллелизма, который будет работать лучше всего? Или есть другой интересный способ сделать это?

Спасибо!

Команда:

subprocess.call ('samtools view -b -f 68 {}> {} _ unmapped_one.bam'.format (self.file_path, self.file_prefix), shell = True)

subprocess.call ('представление samtools -b -f 132 {}> {} _unmapped_two.bam'.format (self.file_path, self.file_prefix), shell = True)

1 Ответ

0 голосов
/ 23 января 2019

Для того, что вы описываете, и для кода, которым вы поделились, я могу придумать несколько способов повысить производительность.

  1. Вы создаете подпроцессы внутри оболочки программы для обработки файла, такой подход будетможет отличаться в зависимости от аппаратного обеспечения, на котором работает программа, если это многопроцессорная среда, это может быть хорошим подходом.
  2. Рассмотрите возможность использования библиотеки pysam , которая содержит низкоуровневый API-интерфейс hstlib.
  3. В зависимости от потока приложений, который вы разрабатываете, вы можете значительно повысить производительность, расширяя параллельные действия с помощью asyncio.В недавней статье *1011* Брэда Саломона кратко объясняются преимущества многопроцессорности, многопоточности и глубоких погружений в asyncio.
  4. Если вы в конечном итоге используете asyncio в системе на основе Unix, я также рекомендую посмотретьв uvloop , который оборачивает libuv в цикл обработки событий
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...