我将我的数据分成多个mysql数据库,但有时我需要从多个分片中收集信息.如何在php中并行查询多个mysql数据库?
我已经看到了一些异步curl请求和shell_exec的例子,但是有更直接的方法吗?
简短版本在标题中.
长版:我正在开发一个使用Java进行科学优化的程序.程序的工作量可以分为并行和串行阶段 - 并行阶段意味着正在执行高度可并行化的工作.为了加速程序(它运行数小时/天),我创建了许多线程,这些线程等于我正在使用的机器上的CPU核心数 - 通常是4或8 - 并在它们之间划分工作.然后我开始这些线程并加入()它们,然后再进入串行阶段.
到现在为止还挺好.令我困扰的是,并行阶段的CPU利用率和加速量远远没有达到"理论最大值" - 例如,如果我有4个核心,我预计会看到350-400%"利用率"(如上图所示)但它反而在180到310之间反弹.仅使用一个线程,我获得100%的CPU利用率.
我知道线程不能全速运行的唯一原因是:由于同步导致的I/O阻塞造成的阻塞
在我的并行线程中没有任何I/O,也没有任何同步 - 线程共享的唯一数据结构是只读的,并且是基本类型或(非并发)集合.所以我正在寻找其他解释.一种可能性是多个线程反复阻塞垃圾收集,但这在内存压力的情况下似乎才有意义,而且我的分配远远高于所需的最大堆空间.
任何建议,将不胜感激.
更新:万一有人好奇,经过一些调查后,我调整了代码以获得一般性能并且看到更好的利用率,即使我改变的任何事情都与同步有关.但是,一些更改应该导致更少的新堆分配,特别是我摆脱了一些迭代器和临时盒装数字的使用(用于高性能Java计算的CERN"Colt"库在这里很有用:它提供了像IntArrayList这样的集合,DoubleArrayList等基本类型.).所以我认为垃圾收集可能是罪魁祸首.
有没有人知道Apple即将推出的"Grand Central"技术(Snow Leopard)中的任何一个好的网站,以及它与微软的Parallel Extensions(以及原生并行计算的东西)相比如何?
language-agnostic parallel-processing grand-central-dispatch
在需要部分应用程序完全并行的情况下,F#优于C#吗?
我的主要语言是C#,我正在编写一个应用程序,其中构建在应用程序(C#)之上的核心功能必须并且计划非常平行.
我最好在F#中实现这些类吗?
使用bash和常用工具为Linux构建最小任务队列系统的最佳/最简单方法是什么?
我有一个9'000行的文件,每行有一个bash命令行,命令是完全独立的.
command 1 > Logs/1.log
command 2 > Logs/2.log
command 3 > Logs/3.log
...
Run Code Online (Sandbox Code Playgroud)
我的盒子有多个核心,我想同时执行X任务.我在网上搜索了一个很好的方法来做到这一点.显然,很多人都有这个问题,但到目前为止还没有人有一个好的解决方案.
如果解决方案具有以下功能,那将是很好的:
command; command)ls > /tmp/ls.txt)如果它适用于其他Unix克隆而没有太多异国情调的要求,则可获得奖励积分.
我发现了以下文章:使用GCC提供的原子锁操作来替换pthread_mutex_lock函数
它指的是GCC Atomic Builtins.
本文的建议是使用GCC原子内置而不是pthread同步工具.
这是一个好主意吗?
PS.mysql帖子显然具有误导性.Atomic Builtins无法替换所有pthread工具.例如,锁定要求,如果无法获取锁,则线程必须等待.换句话说,它要求操作系统等待,以便等待是被动的.简单的GCC内置无法做到这一点.
是否有可能通过编写telnet服务器来创建python集群,然后telnet-ing命令和来回输出?有没有人对python计算集群有更好的想法?PS.对于python 3.x最好,如果有人知道如何.
让我们假设我们有固定数量的计算工作,没有阻塞,睡眠,I/O等待.这项工作可以很好地并行化 - 它包含100M小型和独立的计算任务.
4核CPU的速度更快 - 运行4个线程还是......让我们说50?为什么第二种变体应该是摇摆不定的?
我假设:当你在4核CPU上运行4个重线程而没有另外占用CPU的进程/线程时,调度程序根本不允许在核心之间移动线程; 在这种情况下,它没有理由这样做.Core0(主CPU)将负责执行硬件计时器的中断处理程序每秒250次(基本Linux配置)和其他硬件中断处理程序,但另一个核心可能不会感到任何担忧.
上下文切换的成本是多少?存储和恢复CPU寄存器的时间是否适用于不同的上下文?CPU内部的缓存,管道和各种代码预测事项怎么样?我们可以说每次切换上下文时,都会损坏CPU中的缓存,管道和一些代码解码功能吗?因此,在单个内核上执行的线程越多,与串行执行相比,它们可以一起完成的工作量减少?
关于多线程环境中的缓存和其他硬件优化的问题现在对我来说是一个有趣的问题.
我是新手使用并行软件包并开始探索它们以加快我的一些工作.我经常遇到的烦恼是,foreach当我没有clusterExport相关的函数/变量时,命令会抛出问题.
我知道下面的例子并不一定foreach要让它快速,但为了便于说明,我将使用它.
library(doParallel)
library(parallel)
library(lubridate)
library(foreach)
cl <- makeCluster(c("localhost", "localhost", "localhost","localhost"), type = "SOCK")
registerDoParallel(cl, cores = 4)
Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d-%m-%Y')), 500, replace = TRUE)
foreach(i = seq_along(Dates), .combine = rbind) %dopar% dmy(Dates[i])
Error in dmy(Dates[i]) : task 1 failed - "could not find function "dmy""
Run Code Online (Sandbox Code Playgroud)
如您所见,有一个错误表明dmy找不到该功能.然后我必须继续添加以下内容:
clusterExport(cl, c("dmy"))
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,除了查看错误以寻找导出内容的线索之外,是否有一种更优雅的方式可以事先知道要导出哪些对象,或者有没有办法在运行之前与所有从属设备共享全局环境foreach?
我在Java程序中使用本机C++库.编写Java程序是为了利用多核系统,但它不能扩展:最佳速度是大约6个核心,即添加更多核心会降低它的速度.我的测试表明,对本机代码本身的调用会导致问题,所以我想确保不同的线程访问本机库的不同实例,从而删除并行任务之间的任何隐藏(内存)依赖关系.换句话说,而不是静态块
static {
System.loadLibrary("theNativeLib");
}
Run Code Online (Sandbox Code Playgroud)
我希望动态地为每个线程加载库的多个实例.主要问题是,这是否可行.然后怎么做!
注意: - 我在Java 7 fork/join以及Scala/akka中实现了.所以对每个平台的任何帮助表示赞赏. - 并行任务完全独立.实际上,每个任务可能会创建一些新任务然后终止; 没有进一步的依赖
这是fork/join样式的测试程序,其中processNative基本上是一堆本机调用:
class Repeater extends RecursiveTask<Long> {
final int n;
final processor mol;
public Repeater(final int m, final processor o) {
n=m;
mol = o;
}
@Override
protected Long compute() {
processNatively(mol);
final List<RecursiveTask<Long>> tasks = new ArrayList<>();
for (int i=n; i<9; i++) {
tasks.add(new Repeater(n+1,mol));
}
long count = 1;
for(final RecursiveTask<Long> task : invokeAll(tasks)) {
count += task.join();
}
return count;
}
} …Run Code Online (Sandbox Code Playgroud)