GNU Parallel:将文件拆分为子文件

2023-11-26

Goal

使用 GNU Parallel 将大 .gz 文件拆分为子文件。由于服务器有 16 个 CPU,因此创建 16 个子级。每个子项最多应包含 N 行。这里,N = 104,214,420 行。子项应采用 .gz 格式。

输入文件

  • 名称:file1.fastq.gz
  • 大小:39 GB
  • 行数:1,667,430,708(未压缩)

Hardware

  • 36GB 内存
  • 16 CPUs
  • HPCC环境(我不是管理员)

Code

版本1

zcat "${input_file}" | parallel --pipe -N 104214420 --joblog split_log.txt --resume-failed "gzip > ${input_file}_child_{#}.gz"

三天过去了,工作还没有完成。 split_log.txt 为空。输出目录中没有可见的子项。日志文件表明并行增加了--block-size从 1 MB(默认)到超过 2 GB。这启发我将代码更改为版本 2。

版本2

# --block-size 3000000000 means a single record could be 3 GB long. Parallel will increase this value if needed.

zcat "${input_file}" | "${parallel}" --pipe -N 104214420 --block-size 3000000000 --joblog split_log.txt --resume-failed "gzip > ${input_file}_child_{#}.gz"

该作业已运行约 2 小时。 split_log.txt 为空。输出目录中还没有可见的子项。到目前为止,日志文件显示以下警告:

parallel: Warning: --blocksize >= 2G causes problems. Using 2G-1.

问题

  1. 我的代码如何改进?
  2. 有没有更快的方法来实现这个目标?

我们假设该文件是一个 fastq 文件,因此记录大小为 4 行。

你将其告诉 GNU Parallel-L 4.

在 fastq 文件中,顺序并不重要,因此您希望将 n*4 行的块传递给子级。

为了有效地做到这一点,你可以使用--pipe-part, 除了--pipe-part不适用于压缩文件,也不适用于-L,所以你必须满足于--pipe.

zcat file1.fastq.gz |
  parallel -j16 --pipe -L 4 --joblog split_log.txt --resume-failed "gzip > ${input_file}_child_{#}.gz"

这会将一个块传递给 16 个子块,一个块默认为 1 MB,在记录边界(即 4 行)处被截断。它将为每个块运行一个作业。但您真正想要的是将输入总共仅传递给 16 个作业,并且您可以进行循环。不幸的是,其中存在随机性的因素--round-robin, so --resume-failed不管用:

zcat file1.fastq.gz |
  parallel -j16 --pipe -L 4 --joblog split_log.txt --round-robin "gzip > ${input_file}_child_{#}.gz"

parallel将很难跟上 16 gzip,但您应该能够压缩 100-200 MB/s。

Now if如果你有未压缩的 fastq 文件,我们可以做得更快,但我们必须作一点欺骗:通常在 fastq 文件中,你会有一个以相同字符串开头的 seqname:

@EAS54_6_R1_2_1_413_324
CCCTTCTTGTCTTCAGCGTTTCTCC
+
;;3;;;;;;;;;;;;7;;;;;;;88
@EAS54_6_R1_2_1_540_792
TTGGCAGGCCAAGGCCGATGGATCA
+
;;;;;;;;;;;7;;;;;-;;;3;83
@EAS54_6_R1_2_1_443_348
GTTGCTTCTGGCGTGGGTGGGGGGG
+EAS54_6_R1_2_1_443_348
;;;;;;;;;;;9;7;;.7;393333

这里是@EAS54_6_R。不幸的是,这也是质量线中的有效字符串(这是一个really愚蠢的设计),但在实践中,我们会非常惊讶地看到以@EAS54_6_R。它只是不会发生。

我们可以利用它来发挥我们的优势,因为现在您可以使用\n其次是@EAS54_6_R作为记录分隔符,然后我们可以使用--pipe-part。额外的好处是顺序将保持不变。这里你必须将块大小设置为大小的 1/16file1-fastq:

parallel -a file1.fastq --block <<1/16th of the size of file1.fastq>> -j16 --pipe-part --recend '\n' --recstart '@EAS54_6_R' --joblog split_log.txt "gzip > ${input_file}_child_{#}.gz"

如果您使用 GNU Parallel 20161222,那么 GNU Parallel 可以为您完成该计算。--block -1意思是:选择一个块大小,以便您可以为 16 个作业槽中的每一个分配一个块。

parallel -a file1.fastq --block -1 -j16 --pipe-part --recend '\n' --recstart '@EAS54_6_R' --joblog split_log.txt "gzip > ${input_file}_child_{#}.gz"

这里 GNU Parallel 不会成为限制因素:它可以轻松传输 20 GB/s。

必须打开文件才能查看重新启动值应该是什么,这很烦人,因此这在大多数情况下都有效:

parallel -a file1.fastq --pipe-part --block -1 -j16 
--regexp --recend '\n' --recstart '@.*\n[A-Za-z\n\.~]'
my_command

这里我们假设这些行将像这样开始:

@<anything>
[A-Za-z\n\.~]<anything>
<anything>
<anything>

即使你有一些以 '@' 开头的质量行,那么它们后面也永远不会跟着以 [A-Za-z\n.~] 开头的行,因为质量行后面总是跟着 seqname 行,这以。。开始 @。


您还可以使用一个很大的块大小,使其相当于未压缩文件的 1/16,但这将是一个坏主意:

  • 您必须能够将完整的未压缩文件保存在 RAM 中。
  • 最后gzip仅在读取最后一个字节(以及第一个字节)后才启动gzip到时候可能就完成了)。

通过将记录数设置为 104214420(使用 -N),这基本上就是您正在做的事情,并且您的服务器可能正在努力将 150 GB 未压缩数据保留在其 36 GB RAM 中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GNU Parallel:将文件拆分为子文件 的相关文章

  • 生成斐波那契数列的 Shell 脚本

    我正在尝试创建一个递归函数来计算斐波那契系列中的第 n 个数字 我已经找到了很多解决这个问题的方法 但我不知道为什么我的解决方案不起作用 谢谢 function fib if 1 eq 1 o 1 eq 2 then return 1 el
  • 如何检查软件包是否已安装并在未安装时安装它?

    我正在 Ubuntu 系统上工作 目前这就是我正在做的事情 if which command gt dev null then echo e Command not found Install y n c read if REPLY y t
  • Parallel.ForEach 比普通 foreach 慢

    我正在 C 控制台应用程序中使用 Parallel ForEach 但似乎无法正确执行 我正在创建一个包含随机数的数组 并且有一个顺序 foreach 和一个 Parallel ForEach 来查找数组中的最大值 使用 C 中的大致相同的
  • 启动 OSX 时未使用 teamcity 代理运行 bash

    我有一个 shell 脚本startup sh执行以下操作 创建 RAM 磁盘并启动 teamcity 代理 bin bash DISK usr bin hdiutil attach nobrowse nomount ram 1677721
  • 为什么 sed 不将 \t 识别为制表符?

    sed s t 1 filename gt sedTmpFile mv sedTmpFile filename 我期待这个sed脚本插入一个tab在每一行前面 filename然而事实并非如此 由于某种原因 它正在插入一个t反而 Not a
  • Bash:执行命令时超时/文件溢出终止

    我正在用 bash 编写一个模拟评分脚本 它应该执行一个 C 程序 该程序将给出一些输出 我将其重定向到一个文件 我试图 1 使其在一定持续时间后超时 并且 2 如果输出文件到达某个文件则终止尺寸限制 不知道如何解决这两个问题 有什么帮助吗
  • 如何在 Bash 脚本中回答“是”

    有一个快速的问题 想象一下我有这样的代码 mkdir p INSTALLDIR sudo apt get install y git clojure leiningen git clone git github com maltoe sto
  • 文件头中 shebang 的用法:是否有任何选项可以在 shebang 中传递多个参数

    我使用不同的命名空间来执行 python 文件 使用 shebang hashbang 来执行此脚本 bin bash c 面临的问题是 shebang 只接受一个参数 即使我传递多个参数 它也会将其视为单个字符串 舍邦使用 sbin ip
  • 工作人员未正确返回的结果 - 雪 - 调试

    我正在使用snow在 R 中封装以在 a 上执行函数SOCK具有在 Linux 操作系统上运行的多台计算机 3 的集群 我尝试用两者运行代码parLapply and clusterApply 如果工作线程级别出现任何错误 工作节点的结果将
  • 如何防止 Conda 默认激活基础环境?

    我最近在我的 Mac 上安装了 anaconda2 默认情况下 Conda 配置为在我打开新的终端会话时激活基本环境 我想要访问 Conda 命令 即我想要将 Conda 的路径添加到我的 PATHConda 在初始化时会执行此操作 所以没
  • 多处理器提升::线程?所有线程都在一个处理器上运行

    我有一个令人尴尬的并行问题 我想在多个处理器上执行 我原以为boost thread会自动将新线程发送到新处理器 但所有线程都在与父进程相同的核心上执行 是否可以让每个线程在不同的处理器上运行 或者我是否需要 MPI 之类的东西 我的怀疑是
  • cron 作业不适用于 xwindow

    我在 crontab 中有以下行 1 xeyes 它不显示任何 xwindow 但相反 1 touch somefile txt 工作正常 尝试在谷歌上搜索但没有得到任何具体答案 如果您运行的命令使用 X 服务器 您必须告诉 cron 在哪
  • $@ 中 args 的 bash 参数大小写

    我有一个带有一长串可选参数的脚本 有些具有相关的值 Such as script first 2012 12 25 last 2012 12 26 copy remove script first 2012 12 25 因此有以下案例陈述
  • SQLPlus 中的运行循环

    我制作了一个 bash 脚本 它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本 如下所示 但是一旦运行它 它就会卡在循环的 BEGIN 中 如下所示 我尝试直接通过SQLPlus运行 结果是一样的 那么任何人
  • 为什么我不能用这个循环从 bash 历史记录中删除多个条目

    这个循环将显示我想要做的事情 但是如果我删除echo从中 它实际上不会删除任何内容 history grep 0 5 0 9 ls cut c1 5 while read id do echo history d id done 我添加了缩
  • python中的多服务器监控/自动重启

    我有 2 个服务器程序 必须使用 GNU Screen 启动 我想使用基于 Python 的程序来强化这些服务器 防止崩溃 该程序启动每个屏幕会话 然后监视服务器进程 如果服务器进程崩溃 我需要 python 代码来终止无关的屏幕会话并再次
  • 减少最大值并保存其索引

    int v 10 2 9 1 3 5 7 1 2 0 0 int maximo 0 int b 0 int i pragma omp parallel for shared v private i reduction max maximo
  • 使用环境变量将参数传递给命令

    我正在尝试编写一个 bash 脚本 该脚本采用环境变量并将其传递给命令 所以如果我有类似的东西 export OUT a arg1 b arg2 0 arg2 1 我想在我的 bash 脚本中执行以下操作
  • 错误:选项“Z”仅在夜间编译器上被接受[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在通过斯坦福操作系统课程 cs140e https web stanford edu class cs140e 其中一个问题是 有一个名
  • 从外部 bash 设置环境变量

    我试图使用 PHP 从命令行 设置 bash 环境变量 但没有成功 buff array buff VARTESTKEY VARTESTVALUE buff export VARTESTKEY file put contents scrip

随机推荐

  • 打开由竖线字符“|”分隔的 csv 文件或不常见的分隔符

    我正在尝试设置一个 Excel VBA 代码来打开一些 csv 文件并将包含的信息拆分为由字符分隔的列 我设法打开文件 但我使用的代码打开文件时没有根据分隔符分割文本 到目前为止我已经尝试过以下代码 Sub OpenCSV Dim wkbT
  • main:Object 的未定义方法复数

    我正在尝试在控制台中测试一种方法 但即使是基本的复数 pluralize 1 person 不会工作 Output NoMethodError undefined method pluralize for main Object from
  • 从下拉列表中获取旧值和新值

    我试图简单地获取以前的值 以及从下拉列表中新选择的值 在此示例中 下拉列表中预先填充了为用户分配的当前组 当下拉列表更改时 我希望能够返回旧值和新值 我已经可以获得旧值 但我不知道如何返回新值 控制器代码 User Object userA
  • es6导入三个.js

    我的 es6 工作流程使用 babel 和 babel plugin transform es2015 modules system js 来only转换模块导入 导出以与 system js 一起使用 我只是对所有 es6 功能使用 绿色
  • VS2013:查找资源字典时出错

    我刚刚拿到VS2013并打开了我的VS2010项目 但是现在我看不到任何 xaml 设计 问题是样式没有被应用
  • 添加多个浮点变量时最小化浮点误差

    在我的 C 应用程序中 我有一个范围 0 1 内的双精度向量 我必须尽可能准确地计算其总数 感觉这个问题之前应该已经解决了 但我找不到任何东西 显然 如果向量大小很大并且有些项目明显小于其他项目 则迭代向量上的每个项目并执行 sum vec
  • 播种default_random_engine?

    我使用的是 Visual Studio 2010 不支持
  • 如何编写 cpp __DIR__ 宏,类似于 __FILE__

    The FILE and LINE 宏内置于C预处理器 通常用于打印带有文件名和行号的调试输出 我需要类似的东西 但只有路径末尾的目录名称 例如 如果我的代码位于 home davidc some path to some code foo
  • Mobile safari 对大图像进行下采样。如何挽留?

    我有一个 HTML 页面 其中包含 1675 像素 x 2640 像素的图像 我尝试在 iPad 上查看它 显然移动 safari 降低了图像的采样率 我们想要展示高质量的图像 但 Safari 限制了这一点 我一直在寻找保留图像大小的解决
  • Java中文件名的编码

    我正在嵌入式 Linux 平台上运行一个小型 Java 应用程序 将Java VM JamVM替换为OpenJDK后 带有特殊字符的文件名无法正确存储 特殊字符 如变音符号 将替换为问号 这是我的测试代码 import java io Fi
  • 为什么反应本机项目是在打字稿中创建的?我想要app.js

    我是 React Native 的初学者 我正在使用 React Native CLI 创建一个 React Native 项目 但项目是使用 app ts 创建的 我想在 javascript 版本中创建项目 我尝试过 React Nat
  • 多重继承不明确的基类

    考虑代码 struct Base struct Derived public Base struct A public Base struct B public A public Base struct C public A public
  • 如何限制 jQuery 事件的回调?

    好的 所以我像在谷歌中一样进行搜索 您在输入中键入文本 它会立即为您提供条目 但我不喜欢这样 我用类似的东西 TEXTINPUT keyup function 当用户输入速度非常快时 它会多次连接到数据库 是否有可能 只有当用户停止输入 1
  • 等待 Workbook.RefreshAll() (C#)

    我想循环遍历一个目录 使用 C 并刷新其中的所有 Excel 工作表 我用 Workbook RefreshAll 我该如何等待Workbook RefreshAll 声明结束 问题是 我打开FileA then Workbook Refr
  • 一个 Java 类中最多可以使用多少个 lambda?

    这是一个纯粹概念性的问题 Java 8 中的 Lambda 被转换为使用以下方式调用的方法invokedynamic 如果 JVM 对一个类可以拥有的最大方法数有限制 这是否意味着一个类中使用的 lambda 最大数量也受到 JVM 的严格
  • 使用 redux 时,应该如何在 React 组件中处理取消订阅?

    在我的组件中 我有以下内容 componentWillMount function this unsubscribe store subscribe function this setState message store getState
  • 如何将Scala Squeryl ORB与play 2.0框架集成?

    我正在尝试将 Squeryl ORB 与 play 2 0 框架一起使用 但是在调用时DB getConnection 在初始化期间我得到 BadPath 路径参数 无效路径 找不到defaultdb的数据源 路径表达式中不允许使用令牌 如
  • 从 device_vector 中删除元素

    推力 device vector 值 推力 device vector 键 初始化后 keys包含一些等于 1的元素 我想删除键中和值相同位置的元素 但不知道并行如何处理 可能有很多方法可以做到这一点 一种可能的方式 使用模板版本thrus
  • Android WebSocket 服务进行多个连接

    我创建了一个 Web 套接字服务 但它不断建立多个连接 我只希望应用程序建立一个连接 除非网络连接断开然后建立另一个连接 但现在 如果我按下手机上的主页按钮 它就会建立一个连接 然后返回应用程序 它将建立另一个连接 谢谢你们的帮助 在创建
  • GNU Parallel:将文件拆分为子文件

    Goal 使用 GNU Parallel 将大 gz 文件拆分为子文件 由于服务器有 16 个 CPU 因此创建 16 个子级 每个子项最多应包含 N 行 这里 N 104 214 420 行 子项应采用 gz 格式 输入文件 名称 fil