如何for并行运行循环(所以我可以使用我的Windows机器上的所有处理器),结果是3维数组?我现在的代码需要大约一个小时才能运行,如下所示:
guad = array(NA,c(1680,170,15))
for (r in 1:15)
{
name = paste("P:/......",r,".csv",sep="")
pp = read.table(name,sep=",",header=T)
#lots of stuff to calculate x (which is a matrix)
guad[,,r]= x #
}
Run Code Online (Sandbox Code Playgroud)
我一直在寻找相关问题并认为我可以使用,foreach但我找不到将矩阵组合成数组的方法.
我是并行编程的新手,所以任何帮助都将非常感谢!
我有一个简单的多处理示例,我正在尝试创建.普通的map()函数版本有效,但是当改为Pool.map时,我收到一个奇怪的错误:
from multiprocessing import Pool
from functools import partial
x = [1,2,3]
y = 10
f = lambda x,y: x**2+y
# ordinary map works:
map(partial(f,y=y),x)
# [11, 14, 19]
# multiprocessing map does not
p = Pool(4)
p.map(partial(f, y=y), x)
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed …Run Code Online (Sandbox Code Playgroud) python parallel-processing functional-programming multiprocessing functools
我正在学习D语言,因为我对它支持并行性感兴趣.这是我项目中的并行代码段:
import std.parallelism;
foreach (node v; taskPool.parallel(std.range.iota(z))) {
// call here
handle(v);
}
Run Code Online (Sandbox Code Playgroud)
如何控制并行工作的线程数?是否有相当于OpenMP的功能omp_set_num_threads?
我在局域网上有两台服务器,全新安装了Centos 6.4 minimal和R 3.0.1.两台计算机都安装了doParallel,snow和snowfall软件包.
服务器可以很好地互相ssh.
当我尝试在任一方向上创建集群时,我会收到密码提示,但输入密码后,它会无限期挂起.
makePSOCKcluster("192.168.1.1",user="username")
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
编辑:
我也尝试在上面提到的计算机上调用makePSOCKcluster,其主机能够用作从属设备(来自其他计算机),但它仍然挂起.那么,是否可能存在防火墙问题?我也尝试使用带端口22的makePSOCKcluster:
> makePSOCKcluster("192.168.1.1",user="username",port=22)
Error in socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, :
cannot open the connection
In addition: Warning message:
In socketConnection("localhost", port = port, server = TRUE, blocking = TRUE, :
port 22 cannot be opened
Run Code Online (Sandbox Code Playgroud)
这是我的iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state …Run Code Online (Sandbox Code Playgroud) 是否有任何有效的方法来并行化Java中的大量GET请求.我有一个200,000行的文件,每个行都需要来自Wikimedia的GET请求.然后我必须将一部分响应写入一个公共文件.我已将下面代码的主要部分粘贴为参考.
while ((line = br.readLine()) != null) {
count++;
if ((count % 1000) == 0) {
System.out.println(count + " tags parsed");
fbw.flush();
bw.flush();
}
//System.out.println(line);
String target = new String(line);
if (target.startsWith("\"") && (target.endsWith("\""))) {
target = target.replaceAll("\"", "");
}
String url = "http://en.wikipedia.org/w/api.php?action=query&prop=revisions&format=xml&rvprop=timestamp&rvlimit=1&rvdir=newer&titles=";
url = url + URLEncoder.encode(target, "UTF-8");
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// optional default is GET
con.setRequestMethod("GET");
//add request header
//con.setRequestProperty("User-Agent", USER_AGENT);
int responsecode = con.getResponseCode();
//System.out.println("Sending 'Get' request to URL: …Run Code Online (Sandbox Code Playgroud) 我正在使用 Linux机器的makeClusterR包中的函数snow来启动远程Linux机器上的SOCK集群.一切似乎已经解决了两台机器成功通信(我能够建立两者之间的ssh连接).但:
makeCluster("192.168.128.24",type="SOCK")
Run Code Online (Sandbox Code Playgroud)
没有任何结果,只是无限期挂起.
我究竟做错了什么?
非常感谢
我对MPI,套接字和TCP/IP有些困惑.所有这三种通信协议都可以使用Infiniband,以太网等不同的互连,还是其他什么?如果问题听起来很幼稚,我很抱歉,但我真的对这三个术语感到困惑.
我有一个长期运行(5-10小时)的Mac应用程序,可以处理5000个项目.通过执行多个转换(使用Saxon),运行一堆脚本(在Python和Racket中),收集数据,并将其序列化为一组XML文件,SQLite数据库和CoreData数据库来处理每个项目.每个项目完全独立于其他项目.
总之,它做了很多,需要很长时间,并且似乎是高度可并行化的.
在加载了需要处理它的所有项目后,该应用程序使用GCD来并行化工作,使用dispatch_apply:
dispatch_apply(numberOfItems, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^(size_t i) {
@autoreleasepool {
...
}
});
Run Code Online (Sandbox Code Playgroud)
我正在使用12核(24虚拟)的Mac Pro上运行该应用程序.所以我希望一直处理24件物品.但是,我通过记录发现正在处理的项目数量在8到24之间变化.这实际上是为运行时间增加了几个小时(假设它一次可以处理24个项目).
一方面,也许GCD真的非常聪明,它已经给了我最大的吞吐量.但是我很担心,因为很多工作都是在这个应用程序产生的脚本中发生的,也许GCD是从不完整的信息推断出来的,并没有做出最好的决定.
任何想法如何提高性能?正确性之后,第一个所需属性缩短了此应用程序运行所需的时间.我不关心功耗,占用Mac Pro或其他任何东西.
更新:实际上,这在文档中看起来很惊人:"在任何给定时刻并发队列执行的任务的实际数量是可变的,并且可以随着应用程序中的条件的变化而动态变化.许多因素会影响由执行的任务执行的任务数量.并发队列,包括可用内核的数量,其他进程正在完成的工作量,以及其他串行调度队列中任务的数量和优先级." (重点补充)看起来让其他进程正常工作会对应用程序中的调度产生负面影响.
能够只是说"同时运行这些块,每个核心一个,不要尝试更聪明地做任何事情",这真是太好了.
parallel-processing macos xcode objective-c grand-central-dispatch
我已经使用Parallel.ForEach功能来同时处理多个客户端,如下所示:
Clients objClient = new Clients();
List<Clients> objClientList = Clients.GetClientList();
Parallel.ForEach<Clients>(objClientList, list =>
{
SendFilesToClient(list);
});
Run Code Online (Sandbox Code Playgroud)
但是现在,我没有创建Client类,而是决定动态创建客户端对象,如下所示:
var xDoc = XDocument.Load(new StreamReader(xmlPath + @"\client.xml"));
dynamic root = new ExpandoObject();
XmlToDynamic.Parse(root, xDoc.Elements().First());
dynamic clients = new List<dynamic>();
for (int i = 0; i < root.clients.client.Count; i++)
{
clients.Add(new ExpandoObject());
clients[i].Id = root.clients.client[i].id;
clients[i].Name = root.clients.client[i].name;
List<string> list = new List<string>();
for (int j = 0; j < root.clients.client[i].emails.email.Count; j++)
{
list.Add(root.clients.client[i].emails.email[j].ToString());
}
clients[i].Email = string.Join(",", list);
}
Run Code Online (Sandbox Code Playgroud)
现在我不使用Client类并动态生成对象,如何使用Parallel.ForEach功能同时处理动态对象中的多个客户端,就像我以前使用类对象一样?
希望我清楚自己.
此外,如果您能告诉我我的方法是否有问题或者告诉我更好的方法,我将不胜感激.
c# parallel-processing .net-4.0 dynamicobject parallel.foreach
我在R中采用并行计算,并做一些基准工作.我注意到,当使用多个内核,system.time节目增加了时间user和system,但elapsed时间减少.这是否表明并行计算是有效的?谢谢.