我有一个4核处理器,并有一个递归Matlab函数,它进行四次递归调用:
function J = do_stuff(I)
if some_condition(I)
J = blah_blah(I);
else
[I1,I2,I3,I4] = split4(I);
J1 = do_stuff(I1);
J2 = do_stuff(I2);
J3 = do_stuff(I3);
J4 = do_stuff(I4);
J = join4(J1,J2,J3,J4);
end
Run Code Online (Sandbox Code Playgroud)
有没有办法让我分配do_stuff(I1)到核心1,do_stuff(I2)核心2,依此类推到核心4?
我有一个我希望以并行方式处理的事件.我的想法是将每个回调添加到ThreadPool,effectivley有每个注册由ThreadPool处理的事件的方法.
我的试用代码如下所示:
Delegate[] delegates = myEvent.GetInvocationList();
IAsyncResult[] results = new IAsyncResult[ delegates.Count<Delegate>() ];
for ( int i = 0; i < delegates.Count<Delegate>(); i++ )
{
IAsyncResult result = ( ( TestDelegate )delegates[ i ] ).BeginInvoke( "BeginInvoke/EndInvoke", null, null );
results[ i ] = result;
}
for ( int i = 0; i < delegates.Length; i++ )
{
( ( TestDelegate )delegates[ i ] ).EndInvoke( results[ i ] );
}
Run Code Online (Sandbox Code Playgroud)
这只是为了玩,因为我很好奇如何做到这一点.我相信有更好的方法可以做到这一点.我不喜欢有一个Func创建一个持有lambda的WaitCallback.此外,与直接调用委托相比,DynamicInvoke相当慢.我怀疑这种处理事件的方式比按顺序执行要快.
我的问题是:如何以并行方式处理事件,最好是使用ThreadPool?
由于我通常使用Mono,因此.NET 4.0或任务并行库都不是一个选项.
谢谢!
编辑: - 通过Earwickers答案更正了示例. - 更新了试用代码
我正在学习并行编程.我想知道分布式内存是否总是多进程,多线程总是共享内存?如果多进程可以用于分布式内存和共享内存?感谢致敬!
首先,来自BOL:
修改表变量的查询不会生成并行查询执行计划.当修改非常大的表变量或复杂查询中的表变量时,性能会受到影响.在这些情况下,请考虑使用临时表.有关更多信息,请参见CREATE TABLE(Transact-SQL).读取表变量而不修改它们的查询仍然可以并行化.
这看起来很清楚.读取表变量而不修改它们的查询仍然可以并行化.
但是在Sun Server Agarwal在2008年3月30日的一篇关于tempdb的文章中说,这是一个声誉卓着的SQL Server存储引擎:
涉及表变量的查询不会生成并行计划.
Sunil是否解释了BOL:INSERT,或者FROM子句中是否存在表变量会阻止并行性?如果是这样,为什么?
我正在考虑控制表用例,其中有一个小控件表连接到一个更大的表,映射值,充当过滤器,或两者兼而有之.
谢谢!
sql sql-server parallel-processing table-variable sql-server-2008
我想创建一个在100毫秒内提供用户界面响应的系统,但这需要几分钟的计算.幸运的是,我可以将它分成很小的部分,这样我就可以将它分发给很多服务器,比方说1500台服务器.查询将被传递给其中一个,然后重新分配到10-100个其他服务器,然后重新分配等等,并且在进行数学运算之后,结果再次传播回来并由单个服务器返回.换句话说,类似于Google搜索.
问题是,我应该使用什么技术?云计算听起来很明显,但1500台服务器需要通过提供特定于任务的数据来为其任务做好准备.可以使用任何现有的云计算平台来完成吗?或者我应该创建1500个不同的云计算应用程序并将它们全部上传?
编辑:专用物理服务器没有意义,因为平均负载将非常非常小.因此,我们自己运行服务器也没有意义 - 它需要是外部提供商的某种共享服务器.
编辑2:我基本上想要总共购买30分钟CPU,而且我愿意花费高达3000美元,相当于每个CPU每天144,000美元.唯一的标准是,这30个CPU分钟分布在1500个响应服务器上.
编辑3:我希望解决方案类似于"使用Google Apps,创建1500个应用程序并部署它们"或"联系XYZ并编写可以部署其服务的asp.net脚本",并根据CPU时间量付费你使用"或类似的东西.
Edit4:低端web服务提供商,在$ 1 /月,提供asp.net实际上解决这个问题 - 我可以创造1500个账户,延迟是确定的(我检查),一切都将是确定 - 除了(!)我需要1500个帐户在不同的服务器上,我不知道任何提供商有足够的服务器能够在不同的服务器上分配我的帐户.我完全清楚服务器之间的延迟会有所不同,有些可能不太可靠 - 但可以通过在不同的服务器上重试来解决这个问题.
编辑5:我刚试了一次并以每月1美元的价格对一家低端网络服务提供商进行了基准测试.如果预加载,他们可以在15ms内完成节点计算并将结果传送到我的笔记本电脑.可以通过在需要实际性能之前不久发出请求来完成预加载.如果节点在15ms内没有响应,则该节点的任务部分可以分发给许多其他服务器,其中一个服务器很可能在15ms内响应.不幸的是,他们没有1500台服务器,这就是我在这里问的原因.
我见过在同一主板上有两个处理器的新电脑.如何在同一主板上的两个处理器正常工作,因为它将像两个大脑(尝试)控制一个主体,实际上他们如何执行并行处理,它实际上是这样做的吗?
我计划增强我对并行和并发编程的了解.有人可以帮我找一些在线学习资源吗?
谢谢,
我想写一个Bash-Script,它通过ssh登录到几台机器,首先显示它们的主机名并执行一个命令(在每台机器上都是相同的命令).命令的主机名和输出应一起显示.我想要一个并行版本,所以ssh-commands应该在后台和并行运行.
我构建了下面附带的bashscripted.问题是:由于runonip-function在子shell中执行,因此无法访问DATA-array来存储结果.以某种方式可能通过"通过引用传递"函数给子shell访问数组吗?
码:
#!/bin/bash
set -u
if [ $# -eq 0 ]; then
echo "Need Arguments: Command to run"
exit 1
fi
DATA=""
PIDS=""
#Function to run in Background for each ip
function runonip {
ip="$1"
no="$2"
cmds="$3"
DATA[$no]=$( {
echo "Connecting to $ip"
ssh $ip cat /etc/hostname
ssh $ip $cmds
} 2>&1 )
}
ips=$(get ips somewhere)
i=0
for ip in $ips; do
#Initialize Variables
i=$(($i+1))
DATA[$i]="n/a"
#For the RunOnIp Function to background
runonip $ip …Run Code Online (Sandbox Code Playgroud) 我有一个包含一个巨大的表的数据库.目前,查询可能需要10到20分钟的任何时间,我需要将其缩短到10秒.我花了几个月尝试不同的产品,比如GridSQL.GridSQL工作正常,但使用自己的解析器,它没有所有需要的功能.我还以各种方式优化了我的数据库,但没有得到我需要的加速.
我有一个关于如何扩展查询的理论,这意味着我利用多个节点并行运行单个查询.前提条件是数据被分区(垂直),每个节点上放置一个分区.我们的想法是获取传入的SQL查询,并且只是像在所有节点上一样运行它.将结果返回到协调器节点时,将对结果集的并集运行相同的查询.我意识到像平均值这样的聚合函数需要被重写为一个计数并对节点求和,并且协调器将总和的总和除以计数的总和以得到平均值.
使用此模型无法轻易解决哪些问题.我相信一个问题是计数不同的功能.
编辑:我收到了很多很好的建议,但没有人提到这个方法.
startTrains() - > TotalDist = 100,Trains = [trainA,trainB],PID = spawn(fun() - > train(1,length(Trains))end),[PID!{self(),TrainData,TotalDist} || TrainData < - Trains],在10500 - > refresh end之后接收{_From,Mesg} - > error_logger:info_msg("~n Mesg~p~n",[Mesg]).
所以,我创建了名为trainA,trainB的两个进程.我希望将这些过程递增5,直到达到100.我做了不同的过程,使每个列车(过程)平行增加其位置.但我很惊讶地顺序获得输出,即进程trainA结束然后进程trainB开始.但我想同时增加自己.我想运行这样的流程
trainA 10 trainB 0
trainA 15 trainB 5
....
trainA 100 trainB 100
Run Code Online (Sandbox Code Playgroud)
但我得到了
trainA 0
....
trainA 90
trainA 95
trainA 100
trainA ends
trainB 0
trainB 5
trainB 10
.....
trainB 100
Run Code Online (Sandbox Code Playgroud)
如何使进程并行/同时运行?希望你得到我的Q. 请帮我.
sql ×2
algorithm ×1
bash ×1
c# ×1
cloud ×1
concurrency ×1
database ×1
delegates ×1
deployment ×1
erlang ×1
matlab ×1
performance ×1
process ×1
recursion ×1
scope ×1
sql-server ×1