有没有办法让子程序在处理时发回数据?例如(此示例仅用于说明) - 子例程读取文件.当它正在读取文件时,如果满足某些条件,则"返回"该行并继续处理.我知道有些人会回答 - 你为什么要那样做?你为什么不......?,但我真的想知道这是否可能.
我正在尝试计算我的java appengine应用程序每天的唯一身份用户数.我已决定使用mapreduce框架(mapreduce.appspot.com)进行java appengine离线执行此计算.我已经设法创建了一个map reduce工作,它遍历我所有代表单个用户会话事件的实体.我也可以使用一个简单的计数器.我有几个问题:
1)我如何只为每个用户ID增加一次计数器?我目前正在映射包含用户ID属性的实体,但许多这些实体可能包含相同的用户ID,所以我如何只计算一次?
2)一旦我将这些作业的结果存储在这些计数器中 - 我如何将它们保存到数据存储区?我在mapreduce的状态页面上看到了计数器的结果,但我希望这些结果自动保存到数据存储区.
想法?
是否List<T>或HashSet<T>其他任何内置的线程安全仅用于添加?
我的问题类似于Threadsafe和泛型arraylist?但我只是寻求安全,以涵盖添加到此列表线程,而不是删除或从中读取.
我是C#Parallel.ForEach,和.NET的新手.我想并行化涉及数千个位置的搜索.对于每个位置,我计算大圆距离.这是我想要传播到不同核心的计算.我的问题是,如果我只有一个线程局部变量,我该怎么做呢,就像在这个MSDN TPL示例中一样?对于结果,我看了看Interlocked,看到它的选项Add,CompareExchange,Decrement,Exchange,Increment和Read,但我不只是增加,递增,递减,或测试是否相等.我希望通过并行运行的多个线程返回对象,这个线程总体上最短距离.我的直觉说这应该很容易,我应该能够创建一个包裹Location一个距离的小物体,但是如何从每个线程中捕获最佳答案然后选择它们之间的最短距离?这是非并行版本:
Location findClosestLocation(Location myLocation, List<Location> allLocations)
{
double closest = double.MaxValue;
Location closestLoc = null;
foreach (Location aLoc in allLocations)
{
if (aLoc != myLocation)
{
double d = greatCircle(myLocation, aLoc);
if (d < closest)
{
closest = d;
closestLoc = aLoc;
}
}
}
return closestLoc;
}
Run Code Online (Sandbox Code Playgroud)
我确实看到一个似乎提供了很好建议的DDJ博客文章,但我想知道这是否是最好的建议.我看到作者循环遍历数组,并想知道是否没有更多功能的方法来做到这一点.在我将使用的功能世界中map …
(编辑:澄清一下,我的主要目标是并发,但不一定是多核机器)
我对所有关于并发的概念都相当新,但我发现我需要有并行绘图例程,原因有很多:
然而,作为一个初学者,我的代码很快看起来像一团糟,重构或错误修复变得如此尴尬,我决定在做任何严肃的事情之前我需要更多地使用它.
所以,我想知道如何制作干净,易于保存的.NET多线程代码,这些代码在我第二天醒来后看到它时才有意义.我遇到的最大问题是构建应用程序,因此所有部分都以智能(而不是笨拙和hacky)方式相互交谈.
任何建议都是受欢迎的,但我喜欢我可以在空闲时间消化的来源(例如,不是500多页的并发论文)和C#/ VB.NET,直到最新版本(因为我看到那里)一直在进步).基本上我想要一些直截了当的东西,所以我可以开始玩我的玩具项目的概念.
我正在尝试在Java中并行化算法.我从合并排序开始,并在这个问题上发布了我的尝试.我修改过的尝试是在下面的代码中,我现在尝试并行快速排序.
在我的多线程实现或解决此问题的方法中是否存在任何新手错误?如果不是,我不应期望在双核上的顺序算法和并行算法之间的速度增加超过32%(参见底部的时间)?
这是多线程算法:
public class ThreadedQuick extends Thread
{
final int MAX_THREADS = Runtime.getRuntime().availableProcessors();
CountDownLatch doneSignal;
static int num_threads = 1;
int[] my_array;
int start, end;
public ThreadedQuick(CountDownLatch doneSignal, int[] array, int start, int end) {
this.my_array = array;
this.start = start;
this.end = end;
this.doneSignal = doneSignal;
}
public static void reset() {
num_threads = 1;
}
public void run() {
quicksort(my_array, start, end);
doneSignal.countDown();
num_threads--;
}
public void quicksort(int[] array, int start, int end) {
int …Run Code Online (Sandbox Code Playgroud) 什么是OpenMP的高级描述?
在维基百科的文章指出,"OpenMP的(开放式多处理)是一种应用程序编程接口(API),支持多平台共享内存在很多平台上,包括Unix和Microsoft Windows平台上的C,C++和Fortran多处理程序,它由一组影响运行时行为的编译器指令,库例程和环境变量." 什么?
它与其他并发方法(如线程,线程池和工作窃取)相比如何?
我怀疑我将很快耗尽单个计算机中多核处理线程的速度提升.
这个.NET桌面程序员需要学习什么才能将并行可行的问题转移到多台计算机上?我倾向于最小化整个生命周期编程工作,因此如果内部部署和外部部署之间的变化很小,则首选.
关于程序员工时,在Windows上对于这样的应用程序,Linux,LAMP还是其他一些堆栈方式比C#.NET更好?
编辑: 下面我自己的评论中的一些其他信息.问题的计算密集型部分可以任意大,因此分配/重新组合的开销不用担心,因为开销只占您必须等待结果的一小部分时间.这是一个单人开发团队.只是一个建议,我不知道它是否有任何好处:WCF和XML如何以完全本地Azure无知的方式分发问题,并相信它(有一天)将在Azure上工作改变,没有Azure感知的好处.这只是一个未经研究的想法,我希望有人有更好的想法,即使它不是Windows解决方案.
另一个编辑: Digipede提供了性能改进和关于群集和网格之间区别的论文.
http://www.digipede.net/downloads/Digipede_CCS_Whitepaper.pdf
由于我的问题比集群更像网格,我想要便宜地做,我只是尝试WCF方法.
我想为家庭作业实施快速算法,但是使用并行处理来完成这项任务.我听说Quicksort的并行版本是最好的选择,但我不确定这个......也许Heapsort是个好主意.您认为哪种算法是并行环境中最好的算法,为什么?
我已经获得了一个2D矩阵,表示金属板表面的温度点.基质(板)的边缘保持恒定在20摄氏度,并且在一个预定点处存在100摄氏度的恒定热源.所有其他网格点最初设置为50摄氏度.
我的目标是通过对周围的四个网格点(i + 1,i-1,j + 1,j-1)进行迭代平均来获取所有内部网格点并计算其稳态温度,直到达到收敛(迭代之间小于0.02摄氏度).
据我所知,迭代网格点的顺序是无关紧要的.
对我来说,这听起来像是调用Fortran FORALL构造并探索并行化乐趣的好时机.
如何确保代码确实是并行化的?
例如,我可以在我的单核PowerBook G4上编译它,并且由于并行化,我预计速度不会提高.但如果我在双核AMD Opteron上编译,我会假设FORALL结构可以被利用.
或者,有没有办法衡量程序的有效并行化?
更新
回答MSB的问题,这是与gfortran版本4.4.0.gfortran是否支持自动多线程?
值得注意的是,FORALL结构已被淘汰,我想,那就是自动向量化.
也许这对于一个单独的问题是最好的,但自动矢量化是如何工作的?编译器是否能够检测到循环中只使用纯函数或子例程?