Tag: 并行处理

异步任务’堵塞’

最近我开始尝试大规模搜索一个网站用于存档目的,我认为让多个Web请求异步工作以加快速度是个好主意(10,000,000页对于存档来说肯定很多)所以我冒险进入三分钟之后,我开始想知道为什么我正在创建的任务(通过Task.Factory.StartNew )是“堵塞”。 懊恼和好奇我决定测试一下,看它是不是仅仅是因为环境的结果,所以我在VS2012中创建了一个新的控制台项目并创建了这个: static void Main(string[] args) { for (int i = 0; i { t.Stop(); Console.ForegroundColor = ConsoleColor.Green; //Note that the other tasks might manage to write their lines between these colour changes messing up the colours. Console.WriteLine(“Task ” + i2 + ” started after ” + t.Elapsed.Seconds + “.” + t.Elapsed.Milliseconds + “s”); […]

为什么Task.WaitAny没有抛出exception?

在下面的代码中,“内部捕获块”从不打印。 尽管打印了“最后一行”。 为什么这样? 请帮忙。 Task task1 = Task.Factory.StartNew(() => { throw new Exception(“some exception”); }); try { Task.WaitAny(new Task[] { task1 }); } catch(Exception e) { Console.WriteLine(“Inside catch block.”); } Console.WriteLine(“Final line.”);

C#I / O Parallelism确实提高了SSD的性能?

我在这里读了一些答案( 例如 ),其中一些人说并行性不会提高性能(可能在读取IO中)。 但我创建了一些测试,表明WRITE操作也更快。 – 阅读测试: 我用伪数据创建了随机6000文件: 让我们尝试用w / o并行性来阅读它们: var files = Directory.GetFiles(“c:\\temp\\2\\”, “*.*”, SearchOption.TopDirectoryOnly).Take(1000).ToList(); var sw = Stopwatch.StartNew(); files.ForEach(f => ReadAllBytes(f).GetHashCode()); sw.ElapsedMilliseconds.Dump(“Run READ- Serial”); sw.Stop(); sw.Restart(); files.AsParallel().ForAll(f => ReadAllBytes(f).GetHashCode()); sw.ElapsedMilliseconds.Dump(“Run READ- Parallel”); sw.Stop(); 结果1: 运行READ- Serial 595 运行READ- Parallel 193 结果2: 运行READ- Serial 316 运行READ-Parallel 192 – 写测试: 要创建1000个随机文件,每个文件为300K。 (我从prev test中清空了目录) var bytes […]

遍历树时使用线程

我想加快穿越树的过程。 以下是节点的示例: class Node { public List Children { get; set; } public int SompeProperty { get; set; } public String SomeOtherProperty { get; set; } } 我遍历尝试的方式如下: static void TraverseTree(Node ParentNode) { if (ParentNode.Children == null) return; foreach (var child in ParentNode.Children) { TraverseTree(child); } } ParentNode.Children方法大约需要1毫秒,因为Node表示文件或目录。 我只是用这个节点的例子来说明我的观点。 所以如果你考虑一下,如果第一个节点有4个子节点,并且每个子节点都有10000000个后代,那么如果我们在一个separeate线程中利用并行编程来遍历这4个子节点中的每一个,我们就可以提高这种遍历的速度。 如果那就是情景那么我会采取这种方法。 但如果我事先不知道树的结构我怎么能这样做呢? 我一直在考虑: 1)开始遍历树,将具有子节点的前10个节点放在堆栈上,然后在单独的线程上开始遍历每个节点。 2)做类似的事情: […]

C#Parallel库,XmlReader,XmlWriter

我有一个用例,我需要: 遍历Xml文档中的每个Input节点 对每个输入执行时间密集的计算,并且 将结果写入XML文件。 输入看起来像这样: ABC123 MA Goldman BCD234 CA Goldman 和输出: ABC123 MA Goldman 75.00 Blah BCD234 CA Goldman 55.00 Ack 我想并行运行计算; 典型的输入文件可能有50,000个输入节点,没有线程的总处理时间可能是90分钟。 大约90%的处理时间花在步骤#2(计算)上。 我可以很容易地并行迭代XmlReader : static IEnumerable EnumerateAxis(XmlReader reader, string axis) { reader.MoveToContent(); while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: if (reader.Name == axis) { XElement el = XElement.ReadFrom(reader) as XElement; if […]

无论如何平行收益率c#

我有多个枚举器枚举平面文件。 我最初在并行调用中有每个枚举器,每个Action都添加到BlockingCollection并且该集合返回一个ConsumingEnumerable(); public interface IFlatFileQuery { IEnumerable Run(); } public class FlatFile1 : IFlatFileQuery { public IEnumerable Run() { // loop over a flat file and yield each result yield return Entity; } } public class Main { public IEnumerable DoLongTask(ICollection _flatFileQueries) { // do some other stuff that needs to be returned first: yield […]

并行扩展

我有一个具有大量IO操作的应用程序,例如文件复制,压缩和移动文件系统周围的文件,复制到备份服务器。 我将此程序构建为单线程。 它运行2分钟。 我使用Parallel扩展并使用Task构建了该程序的另一个版本,它几乎在2分钟内运行。 换句话说,由于IO很大,我没有看到使用Parallels带来的性能提升。 如果我将应用程序部署到刀片服务器,我会得到相同的结果吗? 刀片服务器是否比我的工作站更快/更多地处理IO? 将Parallels与IO绑定应用程序一起使用没有任何好处吗?

如何并行运行一组函数并在完成后等待结果?

我需要在同一时间异步运行一组重函数,并在列表中填充结果。 这是伪代码: List results = new List(); List<Func> tasks = PopulateTasks(); foreach(var task in tasks) { // Run Logic in question 1. Run each task asynchronously/parallely 2. Put the results in the results list upon each task completion } Console.WriteLine(“All tasks completed and results populated”); 我需要foreach bock里面的逻辑。 你们能帮助我吗? 我有一些约束:解决方案必须符合.net 3.5(不是.net 4,但是.net 4替代解决方案将因我的知识目的而受到赞赏) 提前致谢。

将单线程应用程序迁移到multithreading,并行执行,蒙特卡罗模拟

我的任务是采用现有的单螺纹蒙特卡罗模拟并对其进行优化 。 这是ac#console app,没有db访问它从csv文件加载一次数据并在最后写出来,所以它几乎只是CPU绑定 ,也只使用大约50mb的内存。 我通过Jetbrains dotTrace探查器运行它。 在总执行时间中,约30%产生均匀随机数,24%将均匀随机数转换为正态分布随机数。 基本算法是一大堆嵌套for循环 ,在中心有随机数调用和矩阵乘法,每次迭代返回一个加到结果列表中的double,这个列表定期排序并测试一些收敛标准(检查时)如果可以接受的话,程序会从循环中分出并写入结果,否则它会继续到最后。 我希望开发人员能够权衡: 我应该使用新的Thread v ThreadPool 我应该查看Microsoft Parallels Extension库 我应该看看AForge.Net Parallel.For , http://code.google.com/p/aforge/任何其他图书馆? 由于我从未编写任何并行或multithreading代码,因此欢迎使用上述教程的一些链接 。 生成大量正态分布随机数的最佳策略,然后消耗它们。 应用程序从未在此状态下使用统一随机数,它们始终转换为正态分布然后消耗。 用于随机数生成的良好快速库(并行?) 考虑到内存因素,我需要多少额外的内存 。 当前应用程序需要2个小时进行500,000次迭代,业务需要将其扩展到3,000,000次迭代,并且每天被称为多次,因此需要进行一些繁重的优化。 特别想听听使用Microsoft Parallels Extension或AForge.Net Parallel的人的意见 这需要相当快地生产,所以即使我知道它已经出现了并发库,我们也可以看看.net 4 beta已经发布了 ,我们可以看一下它在发布之后迁移到.net 4。 目前服务器有.Net 2,我已提交审核升级到我的开发盒所具有的.net 3.5 SP1。 谢谢 更新 我刚刚尝试了Parallel.For实现,但它提出了一些奇怪的结果。 单线程: IRandomGenerator rnd = new MersenneTwister(); IDistribution dist = new […]

并行框架并避免错误共享

最近,我回答了一个关于优化可能的可并行化方法来生成任意基数的每个排列的问题。 我发布了类似于Parallelized,糟糕的实现代码块列表的答案,有人几乎立即指出了这一点: 这几乎可以保证为您提供错误的共享,并且可能会慢很多倍。 (信用gjvdkamp ) 他们是对的, 死亡很慢。 也就是说,我研究了这个主题,并找到了一些有趣的材料和建议 (仅存档的MSDN杂志, .NET Matters:False Sharing )来对抗它。 如果我理解正确,当线程访问连续的内存(例如,可能支持ConcurrentStack的数组)时,可能会发生错误共享。 对于横向规则下面的代码, Bytes为: struct Bytes { public byte A; public byte B; public byte C; public byte D; public byte E; public byte F; public byte G; public byte H; } 对于我自己的测试,我想获得这个运行的并行版本并且真正更快,所以我创建了一个基于原始代码的简单示例。 6作为limits[0]对我来说是一个懒惰的选择 – 我的计算机有6个核心。 单线程块 平均运行时间:10s0059ms var data = new List(); […]