将文件映射到内存中

4
我先解释一下我的问题,因为理解我想要什么很重要 :-)
我正在开发一个使用多个外部工具进行基因组数据分析的Python管道。其中一个工具需要处理非常大的fastq文件,这些文件实际上只是普通文本文件。
通常,这些fastq文件是经过压缩的,由于它们是普通文本,所以压缩比率非常高。大多数数据分析工具都可以使用压缩文件,但我们有少数几个不能使用。因此,我们正在解压这些文件,进行操作,最后重新压缩。
正如你可以想象的那样,这个过程是:
- 更慢 - 占用更多磁盘空间 - 占用带宽(如果在NFS文件系统中工作)
因此,我正在尝试找到一种方法“欺骗”这些工具,使其能够直接使用已压缩的文件而无需触及工具的源代码。
我想过使用FIFO文件,并尝试了一下,但是如果工具多次读取文件或者在文件中查找,就行不通了。
因此,基本上我有两个问题:
1. 是否有任何方法可以将文件映射到内存中,以便您可以执行类似以下操作? ``` ./tool mapped_file ``` 其中mapped_file不是真正的文件,而是对内存映射文件的引用。
2. 是否有任何其他建议可以实现我的目标?
非常感谢大家!
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


嗨 Bernard,那真的非常接近我所需要的!只是...我没有 root 权限 :-( - guillemch
有一个解决方法是在 /etc/fstab 中添加一个条目,这样你就可以做到了,但这需要管理员的合作。或者如果你能够创建自己的虚拟机并使所有东西在其上运行...但我认为对于你所要求的内容来说会变得复杂... - bernard paulus
是的,问题是我们的流水线被外部用户使用,所以我不能假设他们有root访问权限来调整/etc/fstab等内容。再次感谢! - guillemch

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


你好 juniper,谢谢你的回答。有些工具无法从标准输入读取,此外它们可能需要读取多个文件。无论如何,这种解决方案也无法解决当工具多次打开和读取同一文件时出现的问题。不管怎样,还是非常感谢你! - guillemch
我已经了解了Python中的mmap,如果这些工具是用Python编写的那么就太好了。但是仅有管道是用Python编写的,并且它使用subprocess.check_call调用外部工具,因此我无法看到使用mmap的方式。将文件转换为bam与使用gzipped文件存在相同的问题:工具无法理解它们。谢谢! - guillemch

2
考虑查看Pistoia联盟序列压缩比赛中获胜的条目,该比赛对FASTQ压缩工具进行了评分。您可能会发现一种通过随机访问提供IO开销减少和更快的解压性能的工具。

0

如果你在使用Linux系统,你可以编写一个fuse文件系统驱动程序:http://pypi.python.org/pypi/fuse-python

这个fuse驱动程序需要对文件进行压缩和解压缩。也许已经有类似的东西存在了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接