首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程间的协作内存使用?

线程间的协作内存使用?
EN

Stack Overflow用户
提问于 2009-09-22 10:14:41
回答 3查看 212关注 0票数 2

我有一个应用程序,它具有从todo队列处理多个线程的工作。我对进入队列的内容和顺序没有任何影响(它是由用户外部提供的)。队列中的单个工作项可能需要几秒钟到几个小时的运行时间,在处理过程中不应被中断。另外,一个工作项可能消耗几兆字节到2GB左右的内存。内存消耗是我的问题。我在一个有8个并行线程的8GB机器上作为一个64位进程运行。如果它们同时命中一个最坏的工作项,我的内存就用完了。我想知道解决这个问题的最好方法。

  1. 计划谨慎,只运行4个线程。最坏的情况应该不再是一个问题了,但是我们浪费了大量的并行性,使得平均情况变得更慢。
  2. 在以新项开始之前,让每个线程检查可用内存(或者说所有线程分配的内存总量)。只有在剩余内存超过2GB时才开始。定期重新检查,希望其他线程能够完成它们的内存占用,我们可能最终会开始。
  3. 尝试预测队列中需要多少内存项(很难),并进行相应的计划。我们可以重新排序队列(覆盖用户选择),或者简单地调整正在运行的工作线程的数量。
  4. 更多的想法?

我目前倾向于数字2,因为它似乎很容易实现和解决大多数情况。然而,我仍然在想,有什么标准的方法来处理这种情况呢?毕竟,操作系统必须在进程级别上做一些非常类似的事情.

打招呼,

代码语言:javascript
复制
Sören
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-14 16:05:18

我继续讨论赫伯萨特的博客,并挑衅一些非常有用的读者评论。如果你感兴趣的话,可以去萨特磨坊

谢谢你到目前为止的所有建议!

代码语言:javascript
复制
Sören
票数 1
EN

Stack Overflow用户

发布于 2009-09-22 10:37:42

因此,当前最糟糕的内存使用量是16 is。如果只有8GB的RAM,那么在操作系统和系统进程获得它们的份额之后,还剩下6或7GB的内存将是幸运的。因此,平均来说,您将在一个中等负荷的系统上使用内存。这台机器有几个核心?你有8个工作线程,因为它是一个8核心的机器?

基本上,您可以减少内存消耗,或者增加可用内存。您的选项1,只运行4个线程,未充分利用CPU资源,这可能使您的吞吐量减半-绝对次优。

备选案文2是可能的,但有风险。内存管理非常复杂,查询可用内存并不能保证您能够继续分配该数量(而不会导致分页)。磁盘I/O的突发会导致系统增加缓存大小,后台进程可以在其工作集中启动和交换,以及许多其他因素。由于这些原因,可用内存越小,所依赖的内存就越少。而且,随着时间的推移,内存碎片也会导致问题。

选项3很有趣,但很容易导致CPU的卸载.如果您的作业具有很高的内存需求,您可能只运行几个线程,并且处于与选项1相同的情况,在选项1中,您正在卸载内核。

因此,采取“减少消耗”的策略,您是否真的需要立即将整个数据集存储在内存中?取决于算法和数据访问模式(例如。(随机或顺序)您可以逐步加载数据。更复杂的方法可能涉及压缩,这取决于您的数据和算法(但实际上,这可能是浪费精力)。

还有“增加可用内存”。在价格/性能方面,您应该认真考虑购买更多的RAM。有时,投资更多的硬件比开发时间更便宜,以达到同样的最终结果。例如,您可以花几百美元投入32 to的RAM,这将立即提高性能,而不会给解决方案增加任何复杂性。在降低了性能压力后,您可以对应用程序进行分析,以了解您可以在哪里使该软件更高效。

票数 3
EN

Stack Overflow用户

发布于 2009-09-22 10:34:24

很难在不知道自己在做什么的情况下提出解决方案,但考虑:

  1. 查看您的处理算法是否可以在不将整个工作项加载到内存的情况下访问较小的部分中的数据。
  2. 考虑开发基于服务的解决方案,以便工作由另一个流程(可能是web服务)执行。通过这种方式,您可以扩展解决方案,在多个服务器上运行,也许可以使用负载均衡器来分发工作。
  3. 在处理工作项之前,是否将传入的工作项持久化到磁盘?如果不是,他们可能无论如何应该是,特别是如果可能需要一段时间才能得到处理器。
  4. 内存使用量是否与传入工作项的大小成比例,或者其他情况下易于计算?了解这一点将有助于决定如何安排处理。

希望能帮上忙?!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1459224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档