我是一个完全的新手,所以请原谅我的无知和/或可能错误的术语。
我通过 ssh 使用 Ubuntu 服务器进行大脑图像处理(一个命令包含多个程序,每个大脑执行大约需要 4-5 小时),我通过终端运行该图像。由于服务器的存储空间有限(~200GB)并且大脑数据很大(2-3GB 输入,500MB 输出),我不断使用 FileZilla 下载已处理的数据并上传新的待处理数据。
大脑图像处理非常消耗 RAM,并且由于内存问题而失败了好几次,所以我现在正在分别手动执行这两个程序(程序 1 = 脑图像处理与程序 2 = 上传/下载) - 即,当我做一件事时,我不会同时做另一件事。但我想知道是否有一种更有效的方法可以做到这一点,同时仍然确保大脑图像处理不会失败。
简而言之,我希望过程 1 占用所需的 RAM,“其余”分配给过程 2。我目前正在为过程 1 分配所有 8 个核心,但它只经常使用所有 8 个核心(因为程序是如何编写的)。有没有办法实现这一点,理想情况下仍然允许我使用 FileZilla (因为它是如此快速和简单,尽管我不反对通过终端上传/下载)?例如,是否可能是这样的情况:我首先启动的哪个进程都具有“优先权”,并且只占用给定时间点所需的任何内存,而任何其他进程只占用剩余的内存?或者如何在并发运行的进程之间分配 RAM(特别是如果从不同的软件启动,如果这很重要的话)?
我希望这一切都是有道理的。提前致谢!
答案1
这听起来像是 GNU Parallel 的工作:
让我们假设您有足够的 CPU 能力来并行运行 16 个大脑,并且与运行时间(4-5 小时)相比,传输数据所需的时间非常少。
从你的发送机器我会运行:
parallel --delay 1m -j16 -S server --trc {}.output 'process_brain {} > {}.output' ::: brain*.input
选项 | 描述 |
---|---|
--延迟1m | 最多每分钟启动一个作业(这将为第一个作业提供一分钟的完整带宽来传输第一个文件) |
-j16 | 最多并行运行 16 个作业 |
-S 服务器 | 在服务器上 |
--trc {.}.输出 | 将输入文件传输到服务器,完成后将输出传输回,清理(删除服务器上的两个文件) |
'process_brain {} > {.}.output' | 在 Brain*.input 上运行 process_brain 并将其保存在 Brain*.output 中 |
::: | 输入源分隔符 |
大脑*.输入 | 用于输入的文件 |
考虑花 20 分钟阅读第 1+2 章https://doi.org/10.5281/zenodo.1146014。您的命令行会因此而喜欢您。