数据占用多少RAM



如何确定存储数据集所需的RAM量?

我知道这是一个非常普遍的问题,所以,希望这个例子能缩小我试图理解的范围:

我有一个数据文件,数据文件包含字符[a-Z]和数字(没有特殊符号)。我想将数据读取到RAM中(使用python),然后将数据存储在字典中。我有很多数据和只有2 GB RAM的计算机,所以我想提前知道这些数据是否适合RAM,因为这可能会改变我用Python加载文件和处理下游数据的方式。我认识到,所有的数据可能都不适合RAM,但这是另一个问题,我只想知道这些数据会占用多少RAM,以及我需要考虑什么来做出这个决定。

所以,知道我的文件的内容,它的初始大小,以及我想使用的下游数据结构,我如何计算数据将占用的RAM量?

这里最好的做法不是猜测,也不是阅读源代码并编写严格的证明,而是做一些测试。有很多复杂性使得这些事情很难预测。例如,如果同一字符串有10万个副本,Python会存储实际字符串数据的10万个拷贝,还是只存储1个?这取决于您的Python解释器和版本,以及其他各种因素。

sys.getsizeof的文档中有一个指向递归sizeof配方的链接。这正是衡量数据结构使用了多少存储所需要的。

因此,加载数据的前1%,看看它使用了多少内存。然后加载5%,并确保它大约是原来的5倍大。如果是这样的话,你可以猜测你的完整数据将再次达到20倍大。

(显然,这并不适用于所有可以想象的数据——有些对象的交叉链接越多,你进入文件的距离就越远,其他对象(比如数字)可能会越来越大,等等。但它适用于许多现实的数据。如果你真的很担心,你可以随时测试最后的5%与前5%,看看它们有什么不同,对吧?)

您也可以使用Heapy等模块进行更高级别的测试,或者完全通过使用Process Manager/Activity Monitor等进行外部测试。,仔细检查结果。需要记住的一点是,许多外部度量将显示程序的峰值内存使用情况,而不是当前的内存使用情况。甚至还不清楚你想称之为"当前内存使用情况"。(Python很少将内存释放回操作系统。如果内存未使用,操作系统可能会将其从物理内存中调出,但虚拟机大小不会下降。这对你来说算不算使用?)

最新更新