我经常发现自己编写简单的for循环来对许多文件执行操作,例如:
for i in `find . | grep ".xml$"`; do bzip2 $i; done
Run Code Online (Sandbox Code Playgroud)
看起来有点令人沮丧的是,在我的4核机器上只有一个核心被使用..有一种简单的方法可以为我的shell脚本添加并行性吗?
编辑:为我的问题介绍更多的背景,对不起,我开始时并不是更清楚!
我经常想在合理大小的数据集(通常在100到10,000之间)上运行简单(ish)脚本,例如绘制图形,压缩或解压缩,或运行某些程序.我用来解决这些问题的脚本看起来像上面那样,但可能有不同的命令,甚至是一系列要执行的命令.
例如,刚才我正在运行:
for i in `find . | grep ".xml.bz2$"`; do find_graph -build_graph $i.graph $i; done
Run Code Online (Sandbox Code Playgroud)
所以我的问题绝不是特定于bzip的!(虽然并行bzip确实看起来很酷,但我打算将来使用它).
我编写了一个多线程程序,它通过大量浮点运算来执行一些CPU繁重的计算.更具体地说,它是一个逐帧比较动画序列的程序.即它将动画A中的帧数据与动画B中的所有帧进行比较,对于动画A中的所有帧.我对不同动画并行执行此强化操作,因此程序可以处理AB对,BC对和CA对在平行下.该程序使用QtConcurrent和"map"函数,该函数将带有运动的容器映射到函数上.QtConcurrent为我管理线程池,我正在使用英特尔四核处理器,因此它产生了4个线程.
现在,问题是我的进程会破坏我的CPU.用法是100%不变的,如果我在一个足够大的运动集上运行我的程序(非分页区域中的页面错误),我实际上得到了一个蓝屏死机.我怀疑这是因为我的电脑超频了.但是,这可能是因为我编写程序的方式吗?我用来测试机器稳定性的一些非常密集的benchamrking工具从未使我的PC崩溃.有没有办法控制我的程序如何使用我的CPU来减少负载?或许我误解了我的问题?
我一直在阅读并思考这个问题.嗡嗡声似乎是在多核未来,功能语言将变得更受欢迎.我是函数式编程的相对noob.我唯一的接触是学术性的,并没有足够的复杂性来真正让这类语言顺其自如.
因此,据我所知,纯函数可以轻松,透明地并行化.这是一个很棒的功能,因为它意味着编写线程代码没有麻烦.但是,它似乎没有给串行代码提供太多帮助.
Example:
fooN( ... (foo3(foo2(foo1(0)))))
Run Code Online (Sandbox Code Playgroud)
像这样的串行呼叫似乎是一个常见的,有时是不可避免的问题.对我来说,这些是并行化如此困难的根本原因.有些任务只是(或似乎是)高度连续的.拥有"功能性思维"是否可以让您更好地分解一些看似串行的任务?现有的任何功能语言是否提供透明机制以更好地并行化高度串行代码?最后,函数式语言本质上是否比OO或命令式语言更具可并行性,为什么?
有没有办法在同一台计算机上的MATLAB进程之间共享内存?
我在多核计算机上运行几个MATLAB进程(运行Windows,如果重要的话).它们都使用相同的巨大输入数据.在内存中只有一个副本就好了.
编辑:不幸的是,每个进程都需要访问整个巨大的输入数据,因此没有办法划分数据并解决问题.
我在10G 3节点RAC上使用Oracle并行查询功能,其中每个节点都是16 CPU机器.问题是,如何查看在所有3个节点上执行查询的Oracle进程的实际数量?
我一直在查看文档,在计算出答案在容差范围内后,我找不到任何方法来阻止 Ray。现在我正在用 print('Ok to stop') 将答案写入 csv,然后手动终止该进程。我想停止所有工作人员,然后让它自动转移到另一个问题。我是否可以提出一个错误,使所有工作人员停止?
谢谢。
我想并行执行操作Span<T>,但这样的操作是不合法的:
void DoSomething(Span<int> buffer, int option1, int option2)
{
.......
}
void ParallelDoSomething(Span<int> buffer)
{
var size = buffer.Length;
Parallel.Invoke(() => DoSomething(buffer, 0, size / 2),
() => DoSomething(buffer, size/2, size)); //not legal
}
Run Code Online (Sandbox Code Playgroud)
因为编译器抱怨:不能在匿名方法、lambda 表达式、查询表达式或本地函数中使用 ref、out 或 in 参数“缓冲区”
如何在以Span<T>参数为参数的并行方法中执行?
PyTorch/Numpy 中存在一个错误,即当与 a DataLoader(即设置num_workers > 1)并行加载批次时,每个工作线程使用相同的 NumPy 随机种子,导致并行批次之间应用的任何随机函数都是相同的。
最小的例子:
import numpy as np
from torch.utils.data import Dataset, DataLoader
class RandomDataset(Dataset):
def __getitem__(self, index):
return np.random.randint(0, 1000, 2)
def __len__(self):
return 9
dataset = RandomDataset()
dataloader = DataLoader(dataset, batch_size=1, num_workers=3)
for batch in dataloader:
print(batch)
Run Code Online (Sandbox Code Playgroud)
如您所见,对于每个并行批次集 (3),结果是相同的:
# First 3 batches
tensor([[891, 674]])
tensor([[891, 674]])
tensor([[891, 674]])
# Second 3 batches
tensor([[545, 977]])
tensor([[545, 977]])
tensor([[545, 977]])
# Third 3 batches
tensor([[880, 688]])
tensor([[880, 688]])
tensor([[880, …Run Code Online (Sandbox Code Playgroud) 我在 DataFrame 上进行了大型模拟df,我试图将模拟结果并行化并将模拟结果保存在名为 的 DataFrame 中simulation_results。
并行化循环工作得很好。问题是,如果我要将结果存储在数组中,我会将其声明为SharedArray循环之前。我不知道如何声明simulation_results为“共享数据帧”,它对所有处理器来说都可用并且可以修改。
代码片段如下:
addprocs(length(Sys.cpu_info()))
@everywhere begin
using <required packages>
df = CSV.read("/path/data.csv", DataFrame)
simulation_results = similar(df, 0) #I need to declare this as shared and modifiable by all processors
nsims = 100000
end
@sync @distributed for sim in 1:nsims
nsim_result = similar(df, 0)
<the code which for one simulation stores the results in nsim_result >
append!(simulation_results, nsim_result)
end
Run Code Online (Sandbox Code Playgroud)
问题在于,由于simulation_results未声明为由处理器共享和可修改,因此在循环运行后,它基本上会生成一个空的 DataFrame,如@everywhere simulation_results = similar(df, 0) …