并发读取大文件



我正在创建一个python管道来处理非常大的二进制文件(即50+ GB)。它们是BAM文件,一种用于表示基因组的格式。我的脚本目前受到两个计算成本非常高的子进程调用的瓶颈。

这两个命令占用了每次管道运行的 ~80% 的计算时间,因此我需要找到一种方法来加速此过程。他们从同一个文件中读取数据。我想知道使这项工作更有效率的最佳前进路线。基本上,是否有一种特定的并发风格最适合?还是有其他有趣的方法可以做到这一点?

谢谢!

命令:

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

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

对于您所描述的内容以及您共享的代码,我可以想到几种提高性能的方法。

  1. 您正在程序的 shell 中生成子进程来处理文件,此方法将根据运行程序的硬件而有所不同,如果这是一个多处理器环境,这可能是一个好方法。
  2. 考虑使用 pysam 库来包装低级 hstlib API
  3. 根据您开发的应用程序流 - 您可以通过使用 asyncio 扩展并发活动来显著提高性能。 Brad Salomon 最近的一篇文章简短地解释了多处理和多线程的好处,并深入探讨了 asyncio。
  4. 如果你最终在基于 unix 的系统上使用 asyncio,我还建议看看 uvloop,它将 libuv 包装为事件循环。

最新更新