我有一个应用程序,它具有从todo队列处理多个线程的工作。我对进入队列的内容和顺序没有任何影响(它是由用户外部提供的)。队列中的单个工作项可能需要几秒钟到几个小时的运行时间,在处理过程中不应被中断。另外,一个工作项可能消耗几兆字节到2GB左右的内存。内存消耗是我的问题。我在一个有8个并行线程的8GB机器上作为一个64位进程运行。如果它们同时命中一个最坏的工作项,我的内存就用完了。我想知道解决这个问题的最好方法。
我目前倾向于数字2,因为它似乎很容易实现和解决大多数情况。然而,我仍然在想,有什么标准的方法来处理这种情况呢?毕竟,操作系统必须在进程级别上做一些非常类似的事情.
打招呼,
Sören发布于 2009-10-14 16:05:18
我继续讨论赫伯萨特的博客,并挑衅一些非常有用的读者评论。如果你感兴趣的话,可以去萨特磨坊。
谢谢你到目前为止的所有建议!
Sören发布于 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,这将立即提高性能,而不会给解决方案增加任何复杂性。在降低了性能压力后,您可以对应用程序进行分析,以了解您可以在哪里使该软件更高效。
发布于 2009-09-22 10:34:24
很难在不知道自己在做什么的情况下提出解决方案,但考虑:
希望能帮上忙?!
https://stackoverflow.com/questions/1459224
复制相似问题