【问题标题】:At what point am I using too much memory on a Mac?我什么时候在 Mac 上使用了太多内存?
【发布时间】:2020-02-10 03:47:18
【问题描述】:

我已经非常努力地弄清楚为什么我的 python 使用了 8 gigs 的内存。我什至使用过gc.get_object() 并测量了每个对象的大小,其中只有一个大于 10 兆。尽管如此,所有的对象,大约有 100,000 个,加起来是 5.5 个演出。另一方面,我的电脑运行良好,程序运行速度合理。那么我使用这么多内存的事实是否值得关注?

【问题讨论】:

  • 请提供您在python中运行的代码。或者,您可以强制垃圾收集器使用 gc.collect() 释放未引用的内存
  • 我很想展示代码,但是它太大了,它使用了 90,000 个保存的文件。我暂时放弃了这个问题。该程序以合理的速度运行,因此我将这个问题放在我的优先级列表中。
  • 我觉得这对 SO 来说不是一个好问题。它并不完全是“基于意见的”,但似乎没有真正的答案。当您无法运行您的程序,或者在不对其他程序造成太大影响或没有不当成本的情况下不可行时,您正在使用“太多”内存。话虽如此,在 16G 的机器上使用 8G 很好,因为操作系统不会因为行为不端而杀死你的程序。
  • 但是有两个程序以 8GB 运行。这是因为当你 fork 一个程序时,它的运行速度会快几倍,而且你至少需要两个 fork。
  • 至于“这没有真正的答案”的指控,这不是真的,因为答案是:“是的,运行这么大内存的 Mac 没问题”或“否” .

标签: python macos memory


【解决方案1】:

正如@bnaecker 所说,这没有一个简单的(即是/否)答案。只有当所有正在运行的进程的组合 RSS(驻留集大小)超过可用内存从而导致过度需求分页时,才会出现问题。

你没有说你是如何计算每个对象的大小的。希望是通过使用sys.getsizeof(),它应该准确地包括与每个对象相关的开销。如果你使用了其他一些方法(比如直接调用__sizeof()方法),那么你的答案将远远低于正确的值。但是,即使sys.getsizeof() 也不会考虑由于内存对齐而浪费的空间。例如,考虑这个实验(在 macOS 上使用 python 3.6):

In [25]: x='x'*8193

In [26]: sys.getsizeof(x)
Out[26]: 8242

In [28]: 8242/4
Out[28]: 2060.5

注意最后一个值。这意味着该对象正在使用 2060 和 1/2 个字的内存。这是错误的,因为所有分配都消耗一个单词的倍数。事实上,在我看来,sys.getsizeof() 没有正确解释底层对象或描述对象的数据结构的字对齐和填充。这意味着该值小于对象实际使用的内存量。乘以 100,000 个可能代表大量内存的对象。

此外,许多内存分配器会将大型分配四舍五入到一个页面大小(通常是 4 KiB 的倍数)。这会导致“浪费”的空间可能不会包含在 sys.getsizeof() 返回值中。

【讨论】:

  • 感谢您的信息。我非常感谢。是的,我正在使用 sys.getsizeof()
  • @kylefoley76 请注意,我只触及了这个主题的表面。您的问题属于“性能调整”的广泛类别。即使仅限于特定的操作系统(例如 macOS)和语言(例如 Python),也是一个非常复杂的主题。当我在 20 年前从事此类工作时,客户会为我的专业知识支付超过 200 美元/小时的费用。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 2012-01-12
  • 1970-01-01
相关资源
最近更新 更多