3 个稳定版本
1.7.1 | 2023 年 1 月 23 日 |
---|---|
1.6.0 | 2022 年 8 月 17 日 |
1.5.5 | 2022 年 8 月 16 日 |
#191 in 生物学
88KB
2K SLoC
- TL;DR #+begin_src shell fusta GRCh38.fa -o hg38 cat hg38/fasta/chr{X,Y}.fa > ~/sex_chrs.fa cat hg38/get/chr17:18108706-18179802 > MYO15A.fa rm hg38/seq/chr{3,5}.seq fusermount -u hg38 #+end_src
- 什么是 FUSTA?FUSTA 是一个基于 FUSE 的虚拟文件系统,将(多)FASTA 文件作为虚拟文件的层次结构镜像,简化了高效数据提取和批处理/自动化处理 FASTA 文件。
FUSTA 提供的虚拟文件表现得像标准的平面文本文件,并与所有现有程序自动兼容。在处理大型多FASTA 文件时,利用操作系统内置的文件缓存能力,确保用户获得最佳体验。
** 引用
如果您使用 FUSTA,请引用 [[https://academic.oup.com/bioinformaticsadvances/article/2/1/vbac091/6851693][FUSTA: leveraging FUSE for manipulation of multiFASTA files at scale]], https://doi.org/10.1093/bioadv/vbac091
** 许可证 FUSTA 在 CeCILL-C (LGPLv3 兼容) 许可证下分发。请参阅 LICENSE 文件以获取详细信息。
- 安装 ** Ubuntu #+begin_src sudo apt install cargo fuse3 libfuse3-dev pkg-config cargo install --git https://github.com/delehef/fusta #+end_src
现在您可以在 =/$HOME/cargo/bin/= 中找到 =fusta=;您应该将此路径添加到您的 =/$PATH= 以便于使用。 ** Fedora/Rocky Linux/Alma Linux #+begin_src sudo yum install rust cargo fuse3 fuse3-devel cargo install --git https://github.com/delehef/fusta #+end_src
现在您可以在 =/$HOME/cargo/bin/= 中找到 =fusta=;您应该将此路径添加到您的 =/$PATH= 以便于使用。 ** Debian #+begin_src bash sudo apt install curl fuse3 libfuse3-dev curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh # Debian cargo is outdated #+end_src
最后,安装 FUSTA: #+begin_src bash cargo install --git https://github.com/delehef/fusta #+end_src 你现在可以在 =$HOME/cargo/bin/= 中找到 =fusta=;你应该将此路径添加到你的 =$PATH= 中以便更容易使用。** Scientific Linux #+begin_src bash curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh sudo yum install fuse3 fuse3-devel #+end_src 然后重新启动你的 shell 以更新 =PATH= 环境变量。
最后,安装 FUSTA: #+begin_src cargo install --git https://github.com/delehef/fusta #+end_src
你现在可以在 =$HOME/cargo/bin/= 中找到 =fusta=;你应该将此路径添加到你的 =$PATH= 中以便更容易使用。** macOS 在 macOS 上,如果你还没有准备好构建工具,你需要安装它们:=xcode-select --install=
然后你必须下载并安装 [[https://osxfuse.github.io/][FUSE for macOS]],以便能够使用 FUSTA。
最后,为了构建 FUSTA,你需要安装 [[https://rust-lang.net.cn/en-US/install.html][Rust 编译器]]。然后你可以通过运行 =cargo=,Rust 的构建工具来构建 FUSTA:#'+begin_src cargo install --git https://github.com/delehef/fusta #+end_src ** FreeBSD #+begin_src bash sudo pkg install rust pkgconf fusefs-libs # 安装构建依赖 sudo sysctl vfs.usermount=1 # 启用不需要管理员权限的 FUSE 挂载 sudo kldload fuse # 加载 FUSE 内核模块 #+end_src
最后,安装 FUSTA: #+begin_src cargo install --git https://github.com/delehef/fusta #+end_src
你现在可以在 =$HOME/cargo/bin/= 中找到 =fusta=;你应该将此路径添加到你的 =$PATH= 中以便更容易使用。** 从源代码安装 你应该通过你的包管理器安装 FUSE(以及它的潜在 =devel= 包),请注意,为了加载内核模块,可能需要重启。
要构建 FUSTA,你需要安装 [[https://rust-lang.net.cn/en-US/install.html][Rust 编译器]]。然后你可以通过运行 =cargo=,Rust 的构建工具来构建 FUSTA:#'+begin_src cargo install --git https://github.com/delehef/fusta #+end_src
你现在可以在 =$HOME/cargo/bin/= 中找到 =fusta=;你应该将此路径添加到你的 =$PATH= 中以便更容易使用。
- 用法 ** 快速入门 这些命令将在后台运行 =fusta=,在自动创建的 =fusta= 文件夹中挂载 FASTA 文件 =file.fa=,暴露 =file.fa= 中包含的所有序列。调用 =tree= 将显示虚拟层次结构,然后调用 =fusermount= 以干净地卸载文件。
#+begin_src fusta file.fa tree -h fusta/ fusermount -u fusta #+end_src ** 描述 一旦启动,=fusta= 将以使任何使用它的软件可以像使用一组独立文件一样使用它的方式暴露 FASTA 文件的内容,具体如下。
例如,以下是在挂载包含 /A. thaliana/ 基因组信息的 FASTA 文件后,=fusta= 创建的虚拟层次结构:#'+begin_src fusta ├── append ├── fasta │ ├── 1.fa │ ├── 2.fa │ ├── 3.fa │ ├── 4.fa │ ├── 5.fa │ ├── Mt.fa │ └── Pt.fa ├── get ├── infos.csv ├── infos.txt ├── labels.txt └── seqs ├── 1.seq ├── 2.seq ├── 3.seq ├── 4.seq ├── 5.seq ├── Mt.seq └── Pt.seq #+end_src
FUSTA支持所有使用UNIX风格的行结束符的FUSTA文件,包括但不限于DNA文件、蛋白质文件、间隙文件、大小写混合文件,并且不受其内部格式(换行、行长度、/etc./)的限制。*** =infos.csv= 这个只读的CSV文件包含所有在挂载的FASTA文件中存在的片段列表,对于每个片段,都有标准的“id”和“附加信息”字段,还有一个包含序列长度的第三个字段。*** =infos.txt= 这个只读的文本文件提供了相同的信息,但以更易于阅读的格式呈现。*** =labels.txt= 这个只读文件包含挂载的FASTA文件中所有序列标题的列表。*** =fasta= 这个文件夹包含原始FASTA文件中所有单独的序列,以虚拟独立只读FASTA文件的形式呈现。*** =seqs= 这个文件夹包含原始FASTA文件中所有单独的序列,以虚拟独立读写文件的形式呈现,只包含序列 - 不包含FASTA标题,但保留任何换行。这些文件可以像普通文件一样读取、复制、删除、编辑等,任何更改都会在fusta关闭时反映在原始FASTA文件上。*** =append= 这个文件夹用于向挂载的FASTA文件添加新序列。任何复制或移动到此目录的有效fasta文件都将附加到原始FASTA文件上。请注意,该过程是完全透明的,即使操作成功,该文件夹也将保持空。*** =get= 这个文件夹用于访问挂载的FASTA文件中的序列。虽然它是空的,但对符合模式“SEQID:START-END=”的(不存在)文件进行任何读取操作都将返回指定序列中的对应范围(1索引,全闭区间)。请注意,访问跳过标题和新行,因此“START-END”坐标映射到对应序列的实际位置,而不是挂载的FASTA文件中的字节。** 示例 所有以下示例都假设已挂载一个FASTA文件(例如,=fusta -D genome.fa=),并且在操作后卸载(例如,=fusermount -u fusta=)。*** 获取文件内容概览 #+begin_src shell cat fusta/infos.txt #+end_src *** 将单个序列作为FASTA文件提取 #+begin_src shell cat fusta/fasta/chr{X,Y}.fa > ~/sex_chrs.fa #+end_src *** 提取12号染色体的范围 #+begin_src shell cat fusta/get/chr12:12000000-12002000 #+end_src *** 从原始文件中删除序列 #+begin_src shell rm fusta/seq/chr{3,5}.seq #+end_src *** 添加新序列 #+begin_src shell cp more_sequences.fa fusta/append #+end_src *** 转换序列为大写 #+begin_src shell sed 's/[a-z]/\U&/g' fusta/seqs/chr21.seq | sponge fusta/seqs/chr21.seq #+end_src *** 编辑线粒体基因组 #+begin_src shell nano fusta/seq/chrMT.seq #+end_src *** 批量重命名染色体 #+begin_src shell cd fusta/seq; for i in *; do mv ${i} chr${i}; done #+end_src *** 在外部程序中使用独立序列 #+begin_src shell blastn mydb.db -query fusta/fasta/seq25.fa asgart fusta/fasta/chrX.fa fusta/asgart/chrY.fa --out result.json #+end_src ** 压缩的FASTA文件 FUSTA仅适用于未压缩的(多)FASTA文件。如果您想在压缩的(多)FASTA文件上使用FUSTA,我们建议使用[[https://github.com/yhoogstrate/fastafs][FASTAFS]]作为中介来将压缩的(多)FASTA文件暴露给FUSTA,而无需完全解压缩它。** 运行时选项 #+begin_src USAGE: fusta [OPTIONS]
参数:包含要挂载的序列的(多)FASTA文件
选项:-C, --max-cache 设置用于缓存写入的最大内存量(MB)[默认:500] --cache 使用 mmap、fseek(2) 或内存支持的缓存从 FASTA 文件中提取序列。警告:内存缓存使用的 RAM 量应与 FASTA 文件的大小相当。[默认:mmap] [可能值:file, mmap, memory] -D, --no-daemon 不守护进程 -h, --help 打印帮助信息 -o, --mountpoint 指定用作挂载点的目录;如果不存在则创建 -S, --sep 设置 CSV 文件中使用的分隔符[默认:,] -v 设置冗余级别 -V, --version 打印版本信息 -W, --allow-overwrite 允许 FUSTA 在以下情况下覆盖现有序列:(i)追加新序列与现有 ID 冲突时,(ii)重命名序列 #+end_src
*** =--cache= 缓存选项对于将 FUSTA 适配到您的使用至关重要,对于非平凡大小的文件,正确选择是内存溢出与平稳运行之间的差异
- =file= :: 在此模式下,FUSTA 将所有片段存储为其文件的偏移量,并通过 =fseek= 访问它们。性能可能会最差,但内存消耗将保持在最小。
- =mmap= :: 此模式与上一个模式非常相似,只是访问将通过 [[https://en.wikipedia.org/wiki/Mmap][mmmap(2)]] 读取进行,利用操作系统的缓存功能--这是默认模式。
- =memory= :: 在此模式下,所有片段将直接复制到内存。性能将是最优的,但应该有足够的内存来存储处理过的整个文件。
- 故障排除 *** 我得到一个 "无法分配内存" 错误 FASTA 文件可能溢出了默认的内存超提交保护设置。您可以使用 =sysctl -w vm.overcommit_memory 1= 修改超提交设置,或者使用 =--cache=file= 以降低性能,但减少虚拟内存压力。*** 我 仍然 得到一个 "无法分配内存" 错误 您的 FASTA 文件可能包含相对于程序可以映射的 mmap 页数的太多片段。您可以使用 =sysctl -w vm.max_map_count 200000= 增加最大映射计数,或者使用 =--cache=file= 以降低性能,但减少虚拟内存压力。*** 我还有其他错误 [[https://github.com/delehef/fusta/issues][提出一个问题!]]
- 联系 如果您有任何问题或遇到问题,请不要犹豫 [[https://github.com/delehef/fusta/issues][提出一个问题]]。
- 致谢 FUSTA 站在诸如 [[https://github.com/cberner/fuser][fuser]]、[[https://github.com/clap-rs/clap][clap]]、[[https://github.com/RazrFalcon/memmap2-rs][memmap2]] 和 [[https://github.com/knsd/daemonize][daemonize]] 等项目之上。
- 变更日志 ** v1.7.1
- 修复某些情况下缺少换行符 ** v1.7
- 使用基于 1 的全闭基因组坐标 ** v1.6.1
- 接受更多字符作为 FASTA 序列:=\n - _ . + == ** v1.6
- 修复截断
- 改进错误处理
- 更好的通知
- 添加一个标志,允许作为副作用覆盖现有序列
- 只能将 ASCII 字符内容写入序列文件
- 拒绝打开包含在文件名中无效字符的 ID 的 FASTA 文件 ** v1.5.7
- 更新依赖关系 ** v1.5.6
- 默认挂载点现在是 =fusta-{filename}= ** v1.5.4
- 修复挂载点未创建 ** v1.5.3
- 改进通知系统 ** v1.5.2
- 默认守护进程化 ** v1.5.1
- 更新 memmap 到 memmap2 ** v1.5
- 添加一个基于 ino 的索引以提高性能,但以一些内存为代价 ** v1.4
- 在解析 FASTA 文件之后守护进程化,以便(i)错误立即出现,(ii)在并行启动多个实例时性能更好。** v1.3
- 现在可以缓存所有片段到内存中:增加了 RAM 消耗,但随机访问时间显著减少 ** v1.2.1
- 错误修复 ** v1.2
- FUSTA 现在基于 fuster 而不是 fuse-rs
- 各种优化使得FUSTA能够在6GB RAM中处理大于40GB的FASTA文件,并具有更好的性能。
- 在=notifications=功能门后面添加了可选的通知系统 ** v1.1.1
- 默认使用MMAP。虽然在对非常大的文件进行重操作时可能会导致不愉快的加载,但这应该是一个非常罕见的情况。 ** v1.1
- FUSTA现在可以直接从序列中提取范围 ** v1.0
- 初始发布
依赖项
~13–43MB
~694K SLoC