数据占用多少RAM?

时间:2014-01-04 00:28:15

标签: python memory-management out-of-memory bigdata

如何确定存储一个数据集所需的RAM量(除了跟踪和错误)?

我知道这是一个非常普遍的问题,所以,希望这个例子可以缩小我想要理解的内容:

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

因此,了解我的文件内容,初始大小以及我想要使用的下游数据结构,如何计算数据占用的RAM量?

1 个答案:

答案 0 :(得分:4)

这里最好的办法是不要试图猜测,或者阅读源代码并编写严格的证据,但要做一些测试。有很多复杂因素使得这些事情难以预测。例如,如果你有相同字符串的100K副本,那么Python会存储100K拷贝的实际字符串数据,还是只有1?这取决于你的Python解释器和版本,以及各种其他东西。

sys.getsizeof的文档包含指向recursive sizeof recipe的链接。而这正是衡量数据结构使用量的必要条件。

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

(显然这对所有可想到的数据都不起作用 - 有些对象在你进入文件的时候有更多的交叉链接,其他类似的数字 - 可能会变大,等等。但是它会起作用对于很多现实类型的数据。如果你真的很担心,你总是可以测试最后 5%与前5%相比,看看它们有何不同,对吗?)

您还可以使用Heapy之类的模块在更高级别进行测试,或者只需使用进程管理器/活动监视器等进行完全外部测试,即可仔细检查结果。要记住的一件事是,许多外部测量将显示程序的峰值内存使用情况,而不是当前内存使用情况。而且,无论如何,你甚至不清楚你想要称之为“当前内存使用情况”。 (Python很少会将内存释放回操作系统。如果它不使用内存,它可能会被操作系统从物理内存中分页,但VM大小不会降低。这是否算作使用中,或者不?)