我发布这个问题是为了询问如何在Windows XP机器上优化R中多个处理器的使用.
目前我正在创建4个脚本(每个脚本用例如for(i in 1:100)和(i in 101:200)等),我同时在4个不同的R会话中运行.这似乎使用了所有可用的cpu.
但是,我希望这样做更有效率.一种解决方案可能是使用"doMC"和"foreach"软件包,但这在Windows机器上的R中是不可能的.
例如
library("foreach")
library("strucchange")
library("doMC") # would this be possible on a windows machine?
registerDoMC(2) # for a computer with two cores (processors)
## Nile data with one breakpoint: the annual flows drop in 1898
## because the first Ashwan dam was built
data("Nile")
plot(Nile)
## F statistics indicate one breakpoint
fs.nile <- Fstats(Nile ~ 1)
plot(fs.nile)
breakpoints(fs.nile) # , hpc = "foreach" --> It would be great to test this.
lines(breakpoints(fs.nile))
Run Code Online (Sandbox Code Playgroud)
任何解决方案或建议?
这一切都始于一个我需要严格使用的R包('nlt'),它有另外两个(非常大的)包依赖('adlift','ebayesthresh').我需要它来分析大约4000点的数据样本.
算法创建了许多"隐藏"向量,所以即使乍一看你认为你有足够的内存来加载数据样本并处理它,事情也会变得很快.在这一点上,我应该提到我有4GB内存的Ubuntu x64和Windows x64.
出于纯粹的好奇心和受虐狂,我猜,我决定尝试一下Amazon EC2实例.最后我想其中几个,我在停止高内存超大型实例 17.1 GB内存,6.5的ECU,再次的时候,我跑出来的内存和Ubuntu杀了我的运行功能.
我最终使用了split-apply-combine方法与'snowall','foreach'和'doSMP'.我调整了数据,处理了每个chunck并合并了结果.谢天谢地lapply和sfLapply存在.在我的笔记本电脑上在7分钟内分析样品.
我想我应该感到高兴,但是7分钟仍然很多,我不想再次向亚马逊EC2跳枪,除非没有其他的东西可以缩短运行时间.
我做了一些研究,R的'bigmemory'和'ff'软件包似乎允许相当大的加速,特别是如果我使用了文件备份数据.
所述"NLT"包只需要矢量作为输入,和"bigmemory"例如有其特殊的数据类型,则big.matrix.即使我神奇地能够将big.matrix提供给' nlt '包,这仍然会留下许多新的向量分配,其中标准的R函数被硬编码到包中并且依赖于它.
我一直在考虑面向方面的编程/猴子修补,我设法找到了这种东西的唯一R包,'r-connect'.
现在,正如我所看到的,我有两个主要选择:
我跳鲨鱼了吗?任何人都可以提出另一种解决方案或分享类似的经
我正在尝试并行化一个旧的Makefile.
实际上,我需要确保在编译过程开始之前调用某些生成器脚本不是并行的.
始终在编译之前调用生成器.有没有办法在makefile中建立一个有点关键的部分?
Makefile很乱,我不想在这里发帖.
一旦CSV文件是通过加载read.csv,这是相当琐碎的使用multicore,segue等玩弄于CSV数据.然而,阅读它是时候下沉了.
意识到最好使用mySQL等.
假设使用运行R2.13的AWS 8xl集群计算实例
规格如下:
Cluster Compute Eight Extra Large specifications:
88 EC2 Compute Units (Eight-core 2 x Intel Xeon)
60.5 GB of memory
3370 GB of instance storage
64-bit platform
I/O Performance: Very High (10 Gigabit Ethernet)
Run Code Online (Sandbox Code Playgroud)
任何想法/想法都非常感激.
我在代码中使用Parallel.ForEach和PLINQ越多,我得到的面孔和代码审查就越多.所以我想知道我有什么理由不在每个LINQ语句中使用极端的PLINQ吗?运行时是否能够足够聪明地开始产生如此多的线程(或者从线程池中消耗这么多线程),应用程序性能实际上会降低而不是改进?同样的问题适用于并行库.
我确实理解与线程安全和使用多线程的开销相关的含义.我也意识到并不是一切都有利于并行化.所有我想知道我是否应该停止捍卫我的方法,只是放弃这两个好东西,因为我的同行认为我最好自己做线程控制而不是依靠.NET设施?
更新:请假设硬件足以满足使用多线程的先决条件.
现代编程语言为其用户提供并行和并发机制作为一等公民.我理解并行算法是如何编程的,可以很好地想象多核CPU上的两个线程如何并行运行.
但是,大多数这些平台还支持在单个线程上运行并行进程.
简单来说
我有一个Windows服务,并行执行多个作业作为异步任务.然而,当调用OnStop时,似乎这些都立即被终止而不是被允许以更加亲切的方式停止.
更详细
每个工作代表一次工作的迭代,因此完成工作后,工作需要再次运行.
为实现这一目标,我正在编写一个概念验证Windows服务:
当我运行服务时,我看到所有内容都按预期执行.但是,当我停止服务时,似乎一切都停止了.
好的 - 那这是怎么回事?
在服务中,我有一个取消令牌和一个TaskCompletion Source:
private static CancellationTokenSource _cancelSource = new CancellationTokenSource();
private TaskCompletionSource<bool> _jobCompletion = new TaskCompletionSource<bool>();
private Task<bool> AllJobsCompleted { get { return _finalItems.Task; } }
Run Code Online (Sandbox Code Playgroud)
这个想法是,当每个Job优雅地停止时,Task AllJobsCompleted将被标记为已完成.
OnStart只是开始运行这些作业:
protected override async void OnStart(string[] args)
{
_cancelSource = new CancellationTokenSource();
var jobsToRun = GetJobsToRun(); // details of jobs not relevant
Task.Run(() => this.RunJobs(jobsToRun, _cancelSource.Token).ConfigureAwait(false), _cancelSource.Token);
}
Run Code Online (Sandbox Code Playgroud)
Task RunJobs将以并行循环运行每个作业:
private async Task RunModules(IEnumerable<Jobs> jobs, CancellationToken cancellationToken)
{
var parallelOptions = …Run Code Online (Sandbox Code Playgroud) c# parallel-processing windows-services task-parallel-library async-await
例如,这段代码之间的区别
public Task<IList<NewsSentimentIndexes>> GetNewsSentimentIndexes(DateTime @from, DateTime to = new DateTime(), string grouping = "1h")
{
var result = _conf.BasePath
.AppendPathSegment("news-sentiment-indexes")
.SetQueryParams(new
{
from = from.ToString("s"),
to = to.ToString("s"),
grouping
});
return result
.GetStringAsync()
.ContinueWith(Desereialize<IList<NewsSentimentIndexes>>);
}
Run Code Online (Sandbox Code Playgroud)
然后
public async Task<IList<NewsSentimentIndexes>> GetNewsSentimentIndexes(DateTime @from, DateTime to = new DateTime(), string grouping = "1h")
{
var result = _conf.BasePath
.AppendPathSegment("news-sentiment-indexes")
.SetQueryParams(new
{
from = from.ToString("s"),
to = to.ToString("s"),
grouping
});
var newsStr = await result.GetStringAsync();
return JsonConvert.DeserializeObject<NewsSentimentIndexes>(newsStr);
}
Run Code Online (Sandbox Code Playgroud)
哪一个正确或更快?只是调用这个方法需要等待或只是一个任务?
c# parallel-processing asynchronous task task-parallel-library
在插入符号文档中给出了允许并行处理以下代码的工作原理
library(doMC)
registerDoMC(cores = 5)
## All subsequent models are then run in parallel
Run Code Online (Sandbox Code Playgroud)
但在最新的R版本(3.4)中,doMC包不可用.任何人都可以告诉我任何其他方式进行并行处理?
更新:罗马建议的工作原理.DoMC不适用于Windows.对于Windows使用doParallel包cls = makeCluster(no of cores to use)然后registerDoParallel(cls).还要确保在trControl中将allowParallel设置为TRUE.
我使用以下简单代码来解决n-queens问题:
#lang racket
; following returns true if queens are on diagonals:
(define (check-diagonals bd)
(for/or ((r1 (length bd)))
(for/or ((r2 (range (add1 r1) (length bd))))
(= (abs (- r1 r2))
(abs(- (list-ref bd r1)
(list-ref bd r2)))))))
; set board size:
(define N 8)
; start searching:
(for ((brd (in-permutations (range N))))
(when (not (check-diagonals brd))
(displayln brd)))
Run Code Online (Sandbox Code Playgroud)
它工作正常但需要很长时间in-permutations才能获得更大的N值.它使用函数来获得排列流.我还看到它仅使用25%的CPU功率(正在使用4个核中的1个).如何修改此代码,以便它使用来自in-permutations流的排列并行测试并使用所有4个cpu内核?谢谢你的帮助.
编辑:check-diagonals评论中建议的修改功能.旧代码是:
(define (check-diagonals bd)
(define res #f)
(for ((r1 (length bd))
#:break res)
(for …Run Code Online (Sandbox Code Playgroud) r ×4
c# ×3
.net ×1
async-await ×1
asynchronous ×1
bigdata ×1
c ×1
concurrency ×1
csv ×1
linq ×1
makefile ×1
memory ×1
multicore ×1
n-queens ×1
optimization ×1
performance ×1
plinq ×1
racket ×1
scheme ×1
task ×1
windows ×1