2016-09-20 110 views
2

我写了一个扩展素数的数据库的程序。这个程序是用python编写的,并且运行在Windows 8(x64)和8GB RAM上。使用比可用内存更多的内存

该程序将存储的所有素数存储在listintegers中作进一步计算,并在运行时使用RAM的大约6-7GB。然而,在一些运行中,这个数字降到了100MB以下。内存使用率在运行期间保持低电平,尽管随着更多数字添加到主阵列中而增加。请注意,并非所有运行都会导致内存丢失。

的内存使用任务管理器测量

这些,看似随意,滴,导致我下面的说法:

  1. 有一个在我的代码中的错误,使其跌落关键的数据和搞乱结果(最有可能但不被结果支持)
  2. Python恰好在一段时间后极好地优化了我的代码。
  3. Python或Windows正在通过清理我的素数数组中未使用过多的部分来补偿RAM的过度使用。 (最终导致计算错误)
  4. Python或Windows正在通过分配磁盘空间而不是RAM来补偿RAM过度使用。

问题

  1. 可能是什么这个内存的原因(S)下降?
  2. python如何处理使用超过可用RAM的程序?
  3. Windows如何处理使用多于可用RAM的程序?

回答

5

1,2和3是不正确的理论。

4是正确的。 Windows(不是Python)正在将一些进程内存移动到交换空间。这对您的应用程序几乎完全透明 - 您不需要做任何特殊的事情来应对或处理这种情况。你会注意到唯一的事情是你的应用程序可能会变慢,因为信息是从磁盘写入和读取的。但这一切都透明。有关更多信息,请参阅https://en.wikipedia.org/wiki/Virtual_memory

+0

我是否正确地假设RAM中剩下的是最常用的数据(意味着列表的第一部分,几乎总是被迭代)以及最新添加的数据(最后一部分列表)?而最没有用的数据(中间)被发送到交换空间? –

+0

@FelixZY:也许吧。 Windows(管理虚拟内存)不知道列表的哪一部分是哪一部分。这只是记忆的一页,其中一些似乎比其他的更频繁地使用。操作系统将那些看起来并没有太多用处的东西换掉,作为一名应用程序编写者,您对哪一部分没有太多的控制或知识。 –

1

你听说过分页吗? Windows将一些内存(一段时间未使用过)转储到硬盘驱动器,以防止计算机耗尽或撞击并最终崩溃。

只有Windows处理内存管理。尽管如果你使用Windows 10,它也会压缩你的内存,有点像一个zip文件。

+0

我听说过分页,但我不确定它可以这种方式应用。见我的问题理论#4。 –

+0

是的Python应用程序不会做任何不同于任何其他应用程序。 –