我编写了一个非常简单的"字数统计"程序,它读取文件并计算文件中每个单词的出现次数.这是代码的一部分:
class Alaki
{
private static List<string> input = new List<string>();
private static void exec(int threadcount)
{
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = threadcount;
Parallel.ForEach(Partitioner.Create(0, input.Count),options, (range) =>
{
var dic = new Dictionary<string, List<int>>();
for (int i = range.Item1; i < range.Item2; i++)
{
//make some delay!
//for (int x = 0; x < 400000; x++) ;
var tokens = input[i].Split();
foreach (var token in tokens)
{
if (!dic.ContainsKey(token))
dic[token] = new List<int>();
dic[token].Add(1);
}
}
});
} …Run Code Online (Sandbox Code Playgroud) .net c# multithreading multiprocessing task-parallel-library
我想在一组机器之间共享一个非常大的对象,例如以兆字节甚至几千兆字节的顺序.该对象将被写入一次,但可能会被多次读取.也许一种天真的方法是使用像redis这样的ceneteralized存储.但是,它可能会成为单点故障,而太多请求可能会对redis造成DOS攻击.然后,分布式解决方案更有前途.但是,主要关注的是将结构复制到所有机器上.如果通过主/从技术完成复制,则复制可能会导致主服务器上的流量负载很大,因为对象很大.因此,更好的解决方案是使用P2P策略来复制对象,以减少主服务器上的网络负载.
有没有人知道这个问题的解决方案?也许有些候选人是:
- Redis
- Memcached
- Voldemort
- Hazelcast
我主要关心的是Java接口,共享大对象,高可用性以及用于复制的低网络流量.
先谢谢.
我有一个多线程程序,可以进行大量的内存分配.四核i7 CPU的性能很好,速度提升了3.9倍左右.但是,当程序在12核Xeon CPU上执行时,加速值不会超过5.5X.
我应该提一下GC似乎不是问题,因为在执行超过100秒后,VisualGC报告GC的时间低于1秒.主内存使用属于堆的Eden部分,其他部分几乎不被使用.该代码执行大量的int数组分配并对它们执行一些算术运算.它有点像状态空间探索和新实例的分配是无法避免的.
如您所知,Windows和Linux的标准内存分配器对多线程程序的性能表现不尽如人意,而且ccmalloc和Hoard等很好的替代品可用于C/C++.由于并行部分由完全独立的任务组成且GC时间非常短,我怀疑主要原因应该是当太多线程竞争分配时JVM内存分配器的性能不佳.
有没有人在大规模多线程程序中有JVM分配器的经验,可以就如何克服这个问题提出建议?
PS我已经使用JVM 6,7和8测试了代码.分配率也非常高(大约每秒1000万)但是正如我所提到的,Eden部分被大量使用且工作集小于千兆字节.
有没有人知道一种机制可以捕获正在运行的线程的状态并将其序列化以进一步恢复?
JVM有什么可用的吗?
pthreads怎么样?
我的主要目标是能够将正在运行的线程迁移到远程计算机.