通常我们用freesurfer处理一个数据所用时间需要6个多小时,但实际上电脑的CPU并没有被充分的利用,freesurfer处理一个数据一般只需要一个逻辑内核,所以如果您有10个逻辑内核,可以同时并行处理10个数据,让电脑的利用率达到最大,同样的时间内之前6个小时只处理一个数据,理论上现在可以在6个小时处理10个数据,但其实我实验之后发现,可能需要18个小时来处理10个数据,但也是大大提升了处理效率。
mac查看电脑的物理CPU和逻辑CPU:
sysctl hw.physicalcpu hw.logicalcpu
您应该得到类似这样的结果:
hw.physicalcpu: 4
hw.logicalcpu: 8
本文电脑的逻辑CPU为8个,freesurfer可以同时处理8个数据
一、方法:
您可能需要安装一个Xcode,然后需要一个Homebrew,目的就是拥有一个parallel。Homebrew安装parallel:
brew install parallel
有了parallel我们就可以让逻辑cpu并行处理数据了。
Linux系统安装parallel:
wget https://ftp.gnu.org/gnu/parallel/parallel-20210822.tar.bz2
tar jxvf parallel-20210822.tar.bz2
cd parallel-20210822
./configure --prefix=指定安装路径
make -j 4
make install
二、命令
需要使用bash来运行parallel,查询当前使用的shell可以用:echo $0
如果当前不是bash,想要切换成bash,只需要在命令行上输入:bash
如果你想用当前目录作为工作目录:export SUBJECTS_DIR=`pwd`
之后就是把数据弄成.nii格式放到一个文件夹(SUBJECTS_DIR),运行下面的语句就可以啦:
ls *.nii | parallel --jobs 8 recon-all -s {.} -i {} -all -qcache
recon-all -s subj01 -i subj01.nii -all -qcache
subj01.nii.gz
recon-all -s subj01 -i subj01.nii.gz -all -qcache
ls *.nii | parallel --jobs 8 recon-all -s {..} -i {} -all -qcache
解释一下上面的语句:
ls列出当前工作目录的所有.nii格式的文件;
ls把得到的列表给paralle,--jobs 8使得电脑用不同的内核来并行处理8个数据;
-s {.} 表示每个数据(例如subj001.nii)得到的结果放到一个文件夹中,文件夹命名为subj001;
-i 选项指示使用ls命令的输出作为并行命令的输入。
现在来处理一下你的数据吧:
ls .. | grep ^sub- > subjList.txt
for sub in `cat subjList.txt`; do
cp ../${sub}/ses-BL/anat/*.gz .
done
gunzip *.gz
SUBJECTS_DIR=`pwd`
ls *.nii | parallel --jobs 8 recon-all -s {.} -i {} -all -qcache
rm *.nii
for sub in `cat subjList.txt`; do
mv ${sub}_ses-BL_T1w.nii ${sub}
done
学术引用:应用GNU Parallel处理数据,发表文章时需要引用文献:
Tange, O. (2020, November 22). GNU Parallel 20201122 ('Biden').
Zenodo. https://doi.org/10.5281/zenodo.4284075