我正在尝试使用带有 sort -u 的 egrep 从文件中提取一组唯一的行,然后计算它们。大约 10% 的行(字母表 [ATCG] 中的所有 100 个字符)是重复的。有两个文件,每个文件大约 3 个演出,50% 不相关,所以可能有 3 亿行。
LC_ALL=C grep -E <files> | sort --parallel=24 -u | wc -m
Run Code Online (Sandbox Code Playgroud)
在 LC_ALL=C 和使用 -x 加速 grep 之间,到目前为止最慢的部分是排序。阅读手册页让我找到了 --parallel=n,但实验显示绝对没有任何改进。对 top 的一点挖掘表明,即使使用 --parallel=24,排序过程一次也只能在一个处理器上运行。
我有 4 个具有 6 个内核和 2 个线程/内核的芯片,总共提供 48 个逻辑处理器。请参阅 lscpu,因为 /proc/cpuinfo 会太长。
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 48
On-line CPU(s) list: 0-47
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 4
NUMA node(s): 8 …Run Code Online (Sandbox Code Playgroud) 我使用 netcat 运行一个简单的服务器,如下所示:
while true; do nc -l -p 2468 -e ./my_exe; done
这样,任何人都可以通过端口 2468 连接到我的主机并与“my_exe”对话。
不幸的是,如果其他人想在打开的会话期间连接,它会收到“连接被拒绝”错误,因为 netcat 在下一个“while”循环之前不再处于监听状态。
有没有办法让 netcat 表现得像一个多线程服务器,即总是监听传入的连接?如果没有,是否有一些解决方法?
我想限制grep允许进程命令运行或处于活动状态的时间。
例如。我想执行以下操作:
grep -qsRw -m1 "parameter" /var
Run Code Online (Sandbox Code Playgroud)
但在运行grep命令之前,我想限制grep进程的生存时间,比如不超过 30 秒。
我该怎么做呢?
如果可以,我如何返回或重置为没有时间限制。
我想处理很多文件,因为我这里有一堆内核,所以我想并行处理:
for i in *.myfiles; do do_something $i `derived_params $i` other_params; done
Run Code Online (Sandbox Code Playgroud)
我知道 Makefile解决方案,但我的命令需要 shell globbing 列表中的参数。我发现的是:
> function pwait() {
> while [ $(jobs -p | wc -l) -ge $1 ]; do
> sleep 1
> done
> }
>
Run Code Online (Sandbox Code Playgroud)
要使用它,只需将 & 放在作业和 pwait 调用之后,参数给出并行进程的数量:
> for i in *; do
> do_something $i &
> pwait 10
> done
Run Code Online (Sandbox Code Playgroud)
但这并不能很好地工作,例如,我尝试使用 for 循环转换许多文件但给我错误并留下未完成的作业。
我不敢相信这还没有完成,因为关于 zsh 邮件列表的讨论现在已经很老了。那么你知道更好的吗?
我想知道我的电脑是否已经超过了深蓝的处理能力,深蓝以战胜人类世界冠军加里卡斯帕罗夫而闻名。深蓝的处理速度与现在的core 2 duo、i3等普通台式机处理器相比如何?
有时我会坐在一堆并行运行的程序的输出先进先出。我想合并这些先进先出。天真的解决方案是:
cat fifo* > output
Run Code Online (Sandbox Code Playgroud)
但这需要第一个fifo在从第二个fifo读取第一个字节之前完成,这会阻塞并行运行的程序。
另一种方式是:
(cat fifo1 & cat fifo2 & ... ) > output
Run Code Online (Sandbox Code Playgroud)
但这可能会混合输出,从而在输出中得到半行。
当从多个fifos读取时,必须有一些合并文件的规则。通常逐行执行它对我来说就足够了,所以我正在寻找可以做的事情:
parallel_non_blocking_cat fifo* > output
Run Code Online (Sandbox Code Playgroud)
它将并行读取所有先进先出,并一次将输出与整行合并。
我可以看到编写该程序并不难。您需要做的就是:
所以我的问题不是:可以做到吗?
我的问题是:它已经完成了吗,我可以安装一个工具来做到这一点吗?
编辑:对于将来偶然发现这一点的任何人:Imagemagick 使用 MP 库。如果有可用的核心,那么使用它们会更快,但如果您有并行作业,那就没有帮助了。
执行以下操作之一:
通过让 Imagemagick 仅使用一个线程,它在我的测试用例中减慢了 20-30%,但这意味着我可以在每个核心上运行一项作业而不会出现问题,从而显着提高性能的净值。
在使用 ImageMagick 转换一些图像时,我注意到有些奇怪的效果。使用 xargs 比标准 for 循环慢得多。由于 xargs 仅限于单个进程,因此其行为应类似于 for 循环,因此我对此进行了测试,发现它大致相同。
于是,我们就有了这个演示。
结果:
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 -P 1 convert -auto-level
real 0m3.784s
user 0m2.240s
sys 0m0.230s
/media/ramdisk/img$ time for f in *.bmp; do echo $f ${f%bmp}png; done | xargs -n 2 …Run Code Online (Sandbox Code Playgroud) 我知道有人问过类似的问题,但我认为我的情况有点不同。
假设我有一台带有 Linux 操作系统的 8 核和无限内存的计算机。
我有一个名为 Gaussian 的计算软件,它可以利用多线程。因此,我将其线程数设置为 8,以便进行最大速度的单次计算。但是,当我需要同时运行 8 个计算时,我真的无法决定该怎么做。在这种情况下,我应该将每个作业的线程数设置为 1(在 8 个进程中产生的总共 8 个线程)还是保持为 8(在 8 个进程中产生的总共 64 个线程)?真的很重要吗?一个相关的问题是操作系统是否会自动为每个线程执行不同内核的内核停放?
编辑:我知道基准测试是最好的了解方式。问题是,电脑是我大学的,所以他们一直很忙。换句话说,它的工作量对我来说以一种无法控制的方式变化,因为其他人也在使用这些计算机进行计算,因此无法进行实验。此外,该软件非常昂贵(1500 美元左右)并且每台计算机都获得许可,因此我不能简单地在我的个人计算机上运行基准测试...
linux ×3
bash ×1
cat ×1
cluster ×1
cpu ×1
cuda ×1
fifo ×1
imagemagick ×1
merge ×1
multi-core ×1
netcat ×1
performance ×1
shell ×1
slurm ×1
sorting ×1
task-manager ×1
terminal ×1
zsh ×1