我正在将一个非常庞大的文件加载到 postgresql 数据库中。为此,我首先split在文件中使用获取较小的文件(每个 30Gb),然后使用GNU Parallel和将每个较小的文件加载到数据库中psql copy。
问题是分割文件大约需要7个小时,然后它开始每个核心加载一个文件。我需要的是一种方法来告诉split它每次完成写入文件时将文件名打印到 std 输出,以便我可以将其通过管道传输到Parallel它并在split完成写入时开始加载文件。像这样的东西:
split -l 50000000 2011.psv carga/2011_ | parallel ./carga_postgres.sh {}
Run Code Online (Sandbox Code Playgroud)
我已阅读split手册页,但找不到任何内容。有没有办法用split或任何其他工具来做到这一点?
假设我想在压缩文本文件中找到所有匹配项:
$ gzcat file.txt.gz | pv --rate -i 5 | grep some-pattern
Run Code Online (Sandbox Code Playgroud)
pv --rate此处用于测量管道吞吐量。在我的机器上它大约是 420Mb/s(解压后)。
现在我正在尝试使用 GNU 并行执行并行 grep。
$ gzcat documents.json.gz | pv --rate -i 5 | parallel --pipe -j4 --round-robin grep some-pattern
Run Code Online (Sandbox Code Playgroud)
现在吞吐量下降到 ~260Mb/s。而更有趣的parallel过程本身是使用大量 CPU。多于grep进程(但少于gzcat)。
编辑 1:我尝试了不同的块大小 ( --block),以及-N/-L选项的不同值。在这一点上没有任何帮助。
我究竟做错了什么?
最好不必从源代码编译它。我尝试添加在 Google 上找到的存储库:CentOS 6和CentOS 5,但两者都给了我:
[ec2-user@ip-10-0-1-202 yum.repos.d]$ sudo yum install parallel -y
Loaded plugins: priorities, update-motd, upgrade-helper
amzn-main/2016.03 | 2.1 kB 00:00
amzn-updates/2016.03 | 2.3 kB 00:00
952 packages excluded due to repository priority protections
Resolving Dependencies
--> Running transaction check
---> Package parallel.noarch 0:20160522-1.1 will be installed
--> Processing Dependency: /usr/bin/fish for package: parallel-20160522-1.1.noarch
--> Processing Dependency: /usr/bin/ksh for package: parallel-20160522-1.1.noarch
--> Processing Dependency: /usr/bin/zsh for package: parallel-20160522-1.1.noarch
--> Processing Dependency: /bin/pdksh for package: parallel-20160522-1.1.noarch …Run Code Online (Sandbox Code Playgroud) 我有一个文件夹,里面有大量我想要计算 SHA256 哈希的文件。
我曾经对代码段进行编码:
#!/bin/bash
for file in *; do
sha256sum "$file" > "$file".sha &
done
Run Code Online (Sandbox Code Playgroud)
目前并行计算 sha256 哈希,除了我的计算机只有 16 个物理内核。
所以,我的问题是如何使用 GNU 并行运行它,但只使用我系统上可用的 16 个物理内核运行,并且一旦完成哈希,它会自动选择下一个文件散列?
在 HPC 集群上,我尝试permute2.sh使用 GNU 并行从 1 个 bash 脚本运行多个 bash 脚本 ( ),但是它并没有完成每项工作。它随机完成一项工作,而它却在做另一项工作。
permute1.sh:
PROCS=144
permuations=1000
seq 1 $permuations | parallel -j $PROCS sh permute2.sh {}
Run Code Online (Sandbox Code Playgroud)
permute2.sh(从文件中随机抽取 100 行并对其执行一些操作以进行排列)
id=$1
randomlines=100
awk 'BEGIN{srand();} {a[NR]=$0}
END{for(I=1;I<='$randomlines';I++){x=int(rand()*NR);print a[x];}}'
FILE.txt > results/randomlines.$id.txt
# do stuff with randomlines.$id.txt..
Run Code Online (Sandbox Code Playgroud)
当我运行时, permute1.sh我可以看到它为每个 cpu 1 (randomlines.1.txt - randomlines.144.txt) 创建了 144 个文件,但其中大部分是空的并停止工作,有些已完成。我究竟做错了什么?
我有一个使用 gnu 并行的脚本。我想为每个“迭代”传递两个参数
在串行运行中,我有类似的东西:
for (( i=0; i<=10; i++ ))
do
a = tmp1[$i]
b = tmp2[$i]
done
Run Code Online (Sandbox Code Playgroud)
我想让这个平行
func pf()
{
a=$1
b=$2
}
export -f pf
parallel --jobs 5 --linebuffer pf ::: <what to write here?>
Run Code Online (Sandbox Code Playgroud) 我正在使用比较两个目录的内容diff。
它在多线程系统上仅使用一个线程。有人知道一种必须diff使用多个 cpu/线程的方法吗?parallel也许使用?
我在尝试在 Ubuntu 10.04 上使用并行命令时遇到问题。我查看了并行文档,似乎运行的命令很少。在所有情况下,我只是在不采取任何操作的情况下返回命令提示符。例如,我试图使用 bzip2 压缩一堆文件
17:32 farhat HarshaNaveen$ parallel bzip2 ::: *fastq
17:33 farhat HarshaNaveen$ ls *fastq|parallel bzip2 {}
这些命令都不起作用。也没有任何错误。man 文件中给出的示例虽然运行良好。
18:58farhat HarshaNaveen$ parallel sh -c "echo hi; sleep 2; echo bye" -- 1 2 3
hi
hi
hi
bye
bye
bye
18:58farhat HarshaNaveen$
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
例如,我可以执行:
parallel -j 200 < list0
Run Code Online (Sandbox Code Playgroud)
其中“列表”有:
nice -n -20 parallel -j 100 < list2
nice -n -20 parallel -j 100 < list1
Run Code Online (Sandbox Code Playgroud)
这是否可行/可能?
gnu-parallel ×10
linux ×2
amazon-ec2 ×1
cluster ×1
diff ×1
files ×1
gnu ×1
hashsum ×1
ksh ×1
parallelism ×1
shell ×1
shell-script ×1
split ×1