我是C ++的新手(以及一般的线程),所以我希望你们能提供帮助。
我有几个用户,我给他们的数据是相应的CSV格式。对于每个用户,我必须进行许多计算,保存它们各自的输出,并将它们各自的输出添加到一个大型数组中并保存。
无论如何,我的代码看起来像这样:
for(unsigned int i=0; i<numUsers; i++){
LoadPerson(&pName, &pNum); //Loads a User's Data and kicks of compuation
}
我有几个问题:
1)我可以使用线程吗?我可以同时进行多次这些计算吗?当它完成时,可以附加到上面提到的大数组中。
2)我想如果我这样做,我将不得不锁定大型数组,因为多个线程不能同时附加到同一个数组。这个假设是正确的/我将如何进行?
3)我可以同时拥有的线程数有限制吗?如果每个用户都有自己的线程,并且假设我有50个用户,那太多了吗?或者我应该做什么,我一次只踢10个用户,然后当一个完成另一个开始?因此,例如,我只会在用户1完成时启动用户11。同样,我如何使用线程实现它?
4)任何其他建议也会很棒。这是一个机器学习项目,在我开始进行建模之前,我必须梳理大量数据进行预处理。这很慢。我觉得这种低效率的大部分来自阅读这些非常大的CSV(线程可能会有所帮助)。但如果您有任何其他提示,请告诉我。感谢
答案 0 :(得分:2)
上下文不是非常精确,所以答案是通用的
我可以使用线程吗?我可以进行多项计算吗? 立即行动,当它完成时,附加到提到的大阵列 上方。
如果在线程之间几乎没有数据可以共享,你可以在多线程中有效地进行这种计算
我想如果我这样做,我将不得不锁定大型数组,因为 多个线程不能同时附加到同一个阵列。是 那个假设是正确的/我该怎么做呢?
你是对的,你需要像锁
这样的同步机制我一次可以拥有的线程数量是否有限制?如果每个 用户得到他们自己的线程,让我们说我有50个用户,就是这样 许多?或者我应该做什么,我一次只踢10个用户, 然后当一个人完成另一个人开始?所以,举个例子,我愿意 用户1完成后才启动用户11。再次,我该如何实施 有线程吗?
系统对线程的最大值进行了限制,但它通常远高于你想要的线程,如果你想获得良好的性能,你应该拥有尽可能多的线程,因为你的cpu有核心(提供的线程有相似的负载)。 50个线程可能很多
答案 1 :(得分:0)
将处理视为流经管道的数据 管道有不同的部分:读取,计算,输出。
+-----------+--------------+-------------+
| Read data | Compute data | Output Data |
+-----------+--------------+-------------+
每个部分都可以是一个帖子 “读取”部分读取一些数据,然后将其传递给“计算”部分 Compute部分处理数据,然后传递给Output部分。
通过将每个部分作为线程,您可以拥有缓冲区,以便可以“并行”处理执行。
这是可以应用线程的众多场景之一。