我试图了解如何在.Net中实现Parallelism.以下代码以Reed Copsey Blog为例.
此代码循环遍历客户集合,并在上次联系后的14天后向他们发送电子邮件.我的问题是,如果客户表非常大并且发送电子邮件需要几秒钟,这个代码不会将CPU拒绝服务模式带到其他重要流程吗?
有没有办法并行运行以下代码行,但只使用少量内核,以便其他进程可以共享CPU?或者我是以错误的方式解决问题?
Parallel.ForEach(customers, (customer, parallelLoopState) =>
{
// database operation
DateTime lastContact = theStore.GetLastContact(customer);
TimeSpan timeSinceContact = DateTime.Now - lastContact;
// If it's been more than two weeks, send an email, and update...
if (timeSinceContact.Days > 14)
{
// Exit gracefully if we fail to email, since this
// entire process can be repeated later without issue.
if (theStore.EmailCustomer(customer) == false)
parallelLoopState.Break();
else
customer.LastEmailContact = DateTime.Now;
}
});
Run Code Online (Sandbox Code Playgroud)
一般承认的答案:
思维过程是正确的!正如Cole Campbell指出的那样,通过在此特定示例中指定ParallelOption对象,可以控制和配置应该使用多少个核心.这是怎么回事.
var parallelOptions = new …Run Code Online (Sandbox Code Playgroud) 我正在研究MPI中Quicksort的并行实现的通信复杂性,并且我在书中发现了以下内容:
“一个进程从其他p-1个进程中收集p个常规样本。由于传递的值相对较少,因此消息等待时间可能是此步骤的主要决定因素。因此,收集的通信复杂度为O(log p)”(O实际上是theta,而p是处理器数)。
对广播消息做出相同的确认。
为什么这些组通信复杂度为O(log p)?是因为通信是使用某种基于树的层次结构完成的?
如果延迟不是主要因素,并且发送了大量数据怎么办?复杂度是否为O(n log(p)),其中n是要发送的数据大小除以可用带宽?
而且,MPI_Send()和MPI_Recv()的通信复杂度如何?
提前致谢!
我正在尝试为matchcollection创建一个Parallel.Foreach循环.这是我建造的刮刀.我只需要知道在Parallel.Foreach中放什么
MatchCollection m = Regex.Matches(htmlcon, matchlink, RegexOptions.Singleline);
Parallel.ForEach(WHAT DO I PUT HERE? =>
{
Get(match.Groups[1].Value, false);
Match fname = Regex.Match(htmlcon, @"<span class=""given-name"(.*?)</span>", RegexOptions.Singleline);
Match lname = Regex.Match(htmlcon, @"span class=""family-name"">(.*?)</span>", RegexOptions.Singleline);
firstname = fname.Groups[1].Value;
lastname = lname.Groups[1].Value;
sw.WriteLine(firstname + "," + lastname);
sw.Flush();
}):
Run Code Online (Sandbox Code Playgroud)
我试过了:
Parallel.ForEach<MatchCollection>(m,match =>
Run Code Online (Sandbox Code Playgroud)
但没有运气!
提前致谢!:)
我正在使用c ++为我的计算动力学研究开发一些代码.我的代码解决了稀疏和密集的矩阵,生成网格,并在最微不足道的意义上做类似的操作.我需要并行化我的代码以减少计算时间并为此目的使用OpenMP.
但仔细观察一下商用代码,比如ANSYS CFX,我发现该软件中使用的并行化方案是MPICH2,它是MPI的一种实现方式.
所以你有很多并行化工具/ API:
我使用了其中一些工具,并使用每个工具在本地计算机上获得100%的CPU使用率.
在选择合适的并行化工具时,我不知道应该注意什么标准.什么样的应用需要哪种工具?上述任何一项可用于研究目的吗?其中哪些主要用于商业软件?
我正在使用OpenMP来制作Dijkstra算法的并行版本.我的代码由两部分组成.第一部分仅由一个线程(主)执行.该线程从列表中选择新节点.第二部分由其他线程执行.这些线程改变了从源到其他节点的距离.我的代码中不幸的是错误,因为执行第二部分的许多线程之一突然"消失".可能数据同步存在问题,但我不知道在哪里.如果有人能告诉我我的错误在哪里,我将不胜感激.这是代码:
map<int, int> C;
map<int, int> S;
map<int, int> D;
int init;
int nu;
int u;
int p = 3;//omp_get_num_threads();
int d;
int n = graph->getNodesNum();
#pragma omp parallel shared(n, C, d, S, init, nu, u, D, graph, p) num_threads(p)
{
int myId = omp_get_thread_num();
if (myId == 0)
{
init = 0;
nu = 0;
u = to;
while (init < p - 1)
{
}
while (u != 0)
{
S[u] = 1;
while (nu < p - …Run Code Online (Sandbox Code Playgroud) 我有一个程序,它需要一个非常庞大的输入文件,并从中产生一个字典.由于这不适合内存,我决定使用shelve将其写入我的磁盘.现在我需要利用我的系统中的多个核心(其中8个),这样我就可以加快解析速度.我认为最明显的方法是将输入文件分成8个部分,同时在所有8个部分上运行代码.问题是我最后只需要一本字典.不是8个.那么如何使用shelve并行更新单个字典呢?
我有一个关于使用OpenMP(使用C++)的简单问题,我希望有人可以帮助我.我在下面添加了一个小例子来说明我的问题.
#include<iostream>
#include<vector>
#include<ctime>
#include<omp.h>
using namespace std;
int main(){
srand(time(NULL));//Seed random number generator
vector<int>v;//Create vector to hold random numbers in interval [0,9]
vector<int>d(10,0);//Vector to hold counts of each integer initialized to 0
for(int i=0;i<1e9;++i)
v.push_back(rand()%10);//Push back random numbers [0,9]
clock_t c=clock();
#pragma omp parallel for
for(int i=0;i<v.size();++i)
d[v[i]]+=1;//Count number stored at v[i]
cout<<"Seconds: "<<(clock()-c)/CLOCKS_PER_SEC<<endl;
for(vector<int>::iterator i=d.begin();i!=d.end();++i)
cout<<*i<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码创建了一个v包含该范围内10亿个随机整数的向量[0,9].然后,代码循环v计算每个不同整数的实例数(即,在v中找到多少个,有多少两个,等等)
每次遇到特定的整数时,都会通过递增向量的适当元素来计算d.因此,d[0]计算多少个零,d[6]计算多少六个,依此类推.到目前为止有道理吗?
我的问题是当我尝试使计数循环并行时.如果没有#pragma OpenMP …
我有一个mongodb有成千上万的记录,持有很长的向量.我正在寻找使用某种算法的输入向量与我的MDB数据集之间的相关性.
psudo代码:
function find_best_correlation(input_vector)
max_correlation = 0
return_vector = []
foreach reference_vector in dataset:
if calculateCorrelation(input_vector,reference_vector) > max_correlation then:
return_vector = reference_vector
return return_vector
Run Code Online (Sandbox Code Playgroud)
这是map-reduce模式的一个非常好的候选者,因为我不关心计算运行的顺序.
问题是我的数据库在一个节点上.我想同时运行多个映射(我有一个8核机器)
据我所知,MongoDb每个节点只使用一个执行线程 - 实际上我是按顺序运行我的数据集.它是否正确?
如果是这样,我可以配置每个map-reduce运行的进程数/线程数吗?如果我管理多个并行运行map-reduce的线程,然后汇总结果,我的性能会有很大提高(有人试过)吗?如果没有 - 我可以在同一节点上多次复制我的数据库,并"哄骗"mongoDb在2次重复上运行吗?
谢谢!
我不是程序员,因此简单的答案将不胜感激.我是医学博士,参与了生物信息学项目.
假设我有一个Python脚本,abc.py我有一个文本文件,commandline.txt有113个命令行,每行1个,这个脚本可以并行运行.我希望每个这些作业都在其自己的目录中运行,该目录名为scatter.001,scatter.002,...,scatter.113(每个只有一个唯一的编号),要在我执行的目录中创建来自的脚本.
我正在运行,Windows 7与Python 2.7.
这样做的命令行是什么?(python xyz\abc.py .......)
PS:
-p 100 -m 10000000 -e 10 -k I:\Exome\Invex\analyses\PatientSet.load_maf.pkl ,UBE2Q1,RNF17,RNF10,REM1,PMM2,ZNF709,ZNF708,ZNF879,DISC1,RPL37,ZNF700,ZNF707,CAMK4,ZC3H10,ZC3H13,RNF115,ZC3H14,SPN,HMGCLL1,CEACAM5,GRIN1,DHX8,NUP98,XPC,SP4,SP5,CAMKV,SPPL3,RAB40C,RAB40A,COL7A1,GTSE1,OVCH1,FAM183B,KIAA0831,SPPL2B,ITGA8,ITGA9,MYO3B,ATP2A2,ITGA1,ITGA2,ITGA3,ITGA5,RIT1,ITGA7,TRHR,LOC100132288,DENND4A,DENND4B,TAP2,GAP43,PAMR1,HRH2,HRH3,HRH1,FBXL18,FAM169B,GHDC,SDK1,SDK2,THSD4,THSD1,ZFP161,CHST8,COL4A5,COL4A4,COL4A3,COL4A2,COL4A1,CHST1,CHST5,CHST4,ITGAX I:\Exome\Invex\analyses\First7.final_analysis_set.maf I:\Exome\Invex\temp\unzipped_power_files First7 I:\Exome\Invex\analyses\First7.individual_set.txt I:\Exome\Invex\hg19.fasta I:\Exome\Invex\hg19_encoded_by_trinucleotide.fasta I:\Exome\Invex\TCGA.hg19.June2011.gaf I:\Exome\Invex\hg19 I:\Exome\Invex\pph2_whpss_reduced I:\Exome\Invex\cosmic_num_times_each_chr_pos_mutated.tab
Run Code Online (Sandbox Code Playgroud)
这是commandline.txt中一行的示例.我有113条这样的行,在文件中..
我试图在并行中向DataTable添加一些信息,但是如果循环是长时间它会冻结或者只需要花费很多时间,那么通常用于循环,这是我的Parallel.For循环代码:
Parallel.For(1, linii.Length, index =>
{
DataRow drRow = dtResult.NewRow();
alResult = CSVParser(linii[index], txtDelimiter, txtQualifier);
for (int i = 0; i < alResult.Count; i++)
{
drRow[i] = alResult[i];
}
dtResult.Rows.Add(drRow);
}
);
Run Code Online (Sandbox Code Playgroud)
怎么了?这个Parallel.For循环比正常循环花费的时间多得多,出了什么问题?
谢谢!