将文件映射到内存中

时间:2012-10-12 11:41:06

标签: python memory operating-system fifo fastq

我先解释一下我的问题是什么,因为理解我想要的东西很重要: - )。

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

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

如您所想,这个过程是:

  • 耗材量高
  • 带宽消耗(如果在NFS文件系统中工作)

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

我考虑过使用FIFO文件,我试过了,但是如果该工具多次读取文件,或者工具在文件周围搜索,则无效。

基本上我不得不提问:

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

    ./tool mapped_file(其中mapped_file实际上不是文件,而是对内存映射文件的引用。

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

非常感谢大家!

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

考虑在Pistoia联盟Sequence Squeeze比赛中查看获奖作品,该比赛对FASTQ压缩工具进行了评分。您可以找到一种工具,通过随机访问和更快的解压缩性能来降低IO开销。

答案 2 :(得分:2)

this answer,您可以将整个未压缩的文件加载到ram:

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

然而,这有一个缺点就是将所有内容加载到ram中:你需要有足够的空间来保存未压缩的数据!

完成后使用umount /mnt/ram

答案 3 :(得分:0)

如果您使用的是Linux,可以编写保险丝文件系统驱动程序:http://pypi.python.org/pypi/fuse-python

保险丝驱动程序需要压缩和解压缩文件。也许这样的事情已经存在。