4

我将首先解释我的问题是什么,因为了解我想要什么很重要:-)。

我正在研究一个 python 编写的管道,它使用几个外部工具来执行几个基因组数据分析。其中一个工具适用于非常大的 fastq 文件,这些文件最终不再是纯文本文件。

通常,这个 fastq 文件是 gzip 压缩的,因为它们是纯文本,所以压缩率非常高。大多数数据分析工具都可以处理压缩文件,但我们有一些不能。所以我们正在做的是解压缩文件,使用它们,最后重新压缩。

可以想象,这个过程是:

  • 慢点
  • 高磁盘消耗
  • 占用带宽(如果在 NFS 文件系统中工作)

因此,我试图找出一种“欺骗”这些工具以直接处理 gzip 文件的方法,而无需接触工具的源代码。

我考虑过使用 FIFO 文件,并尝试过,但如果该工具多次读取文件,或者该工具在文件周围寻找,则不起作用。

所以基本上我有问题:

  • 有没有办法将文件映射到内存中,以便您可以执行以下操作:

    ./tool mapped_file(其中 mapped_file 并不是真正的文件,而是对内存映射文件的引用。

  • 关于如何实现我的目标,您还有其他建议吗?

非常感谢大家!

4

4 回答 4

3

这个答案中,您可以将整个未压缩文件加载到 ram 中:

mkdir /mnt/ram
mount -t ramfs ram /mnt/ram
# uncompress your file to that directory
./tool /mnt/ram/yourdata

然而,这有将所有内容加载到内存的缺点:您需要有足够的空间来保存未压缩的数据!

完成后使用umount /mnt/ram

于 2012-10-12T12:11:07.103 回答
2

考虑查看 Pistoia Alliance Sequence Squeeze竞赛中的获奖作品,该竞赛对 FASTQ 压缩工具进行了评级。您可能会找到一个工具,它通过随机访问和更快的解压缩性能来减少 IO 开销。

于 2012-10-12T11:57:41.390 回答
2

如果您的脚本可以从标准输入读取,那么一种可能性是使用 zcat 解压缩和流式传输,然后将其通过管道传输到您的脚本。

像这样的东西:

zcat large_file.gz | ./tool

如果您还想压缩结果,则可以再次将输出通过管道传输到 gzip:

zcat large_file.gz | ./tool | gzip - > output.gz

否则,您可以查看python对内存映射的支持:

http://docs.python.org/library/mmap.html

最后,您可以将 ASCII fastq 文件转换为 BAM 格式,该格式未压缩(本身),但使用更紧凑的格式可以节省空间。请参阅以下内容:

http://picard.sourceforge.net/command-line-overview.shtml#FastqToSam

于 2012-10-12T11:45:32.193 回答
0

如果您在 linux 上,您可以编写一个 fuse 文件系统驱动程序:http: //pypi.python.org/pypi/fuse-python

fuse 驱动程序需要对文件进行压缩和解压。也许这样的事情已经存在。

于 2012-10-12T12:18:10.513 回答