【发布时间】:2017-04-21 05:32:09
【问题描述】:
我想将一个包含 800,000 列和 40,000 行的基因组数据文件拆分为一系列文件,每个文件包含 100 列,总大小为 118GB。
我目前正在运行以下 bash 脚本,多线程 15 次:
infile="$1"
start=$2
end=$3
step=$(($4-1))
for((curr=$start, start=$start, end=$end; curr+step <= end; curr+=step+1)); do
cut -f$curr-$((curr+step)) "$infile" > "${infile}.$curr" -d' '
done
不过,以目前剧本的进度来看,完成拆分需要300天?!
有没有更有效的方法来按列将空格分隔的文件分成更小的块?
【问题讨论】:
-
您可以尝试在每次循环迭代时在后台多次运行 cut 命令,或者您可以考虑其他一些并行运行的方式。
-
@Aserre:我认为它们不是完全重复的,因为这个要求按列拆分,而建议的重复按行拆分文件
-
请编辑 Q 以包含文件的整体大小。 MB? GB?另外,为了一般知识,800,000列带有什么样的数据?!祝你好运。
-
无论如何这可能会很慢。您当前的方法仅使用它读取的每个文件的 0.0125%,从而导致大量冗余读取。另一种方法读取文件一次,但保持 8000 个文件打开以写入每个部分行。这可能是不可行的,尽管您可能可以增加操作系统一次允许的打开文件的数量。 (另一种方法是在写入文件时打开和关闭文件,可能非常慢。)这也不是您想在 shell 中做的事情。