数据占用多少 RAM?

Posted

技术标签:

【中文标题】数据占用多少 RAM?【英文标题】:How much RAM does data take up? 【发布时间】:2014-01-04 00:28:15 【问题描述】:

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

我知道这是一个非常笼统的问题,所以,希望这个例子可以缩小我想要理解的范围:

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

那么知道我的文件的内容、它的初始大小以及我想要使用的下游数据结构,我如何才能确定数据将占用的 RAM 量?

【问题讨论】:

是单字典还是多字典?我认为它应该与文件大小相差不远。 如果将整个文件读入 RAM,则至少需要 N 个字节,如果 N 是文件的大小。然后,当你构建字典时,你应该知道python是如何实现它们的,所以你可能知道n在内存使用中的O函数,如果它知道的话。这当然是一个估计,而且可能相当广泛。 查看***.com/questions/110259/… - 更具体地说,是大量 @user4673 数据类型确实很重要,并且可以节省您指出的空间(例如 32 位和 8 位整数之间的 4 倍。您可能想看看使用 numpy 数组如果您的数据集的一部分是纯数字的(显然您有一些字符串,但也许不是每个条目都是字符串?)当您访问/分析数据时,numpy 可能会更快。也许您可以提供一个样本或您的数据集有问题吗? @user4673:Python 没有 8 位整数或 32 位整数;它具有任意长度的整数,根据它们的大小占用从 16 位到 128Gbits 的任何地方。更重要的是,每个 Python 对象,包括一个整数,都是“装箱”的,带有一个几十字节长的标头。另一方面,Python 也可以折叠不可变的内置类型,所以如果你有 1000000 个数字 1 的副本,你可能只有 真的 有一个数字 1 的副本(并且1000000 对它的引用,但一个引用只是一个指针)。 【参考方案1】:

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

sys.getsizeof 的文档有一个指向recursive sizeof recipe 的链接。这正是您衡量数据结构使用了多少存储空间所需要的。

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

(很明显,这不适用于所有可能的数据——有些对象越深入文件越有交叉链接,其他对象——比如数字——可能会变得更大,等等。但它会起作用对于很多真实类型的数据。如果您真的很担心,您可以随时将最后 5% 与前 5% 进行测试,看看它们有何不同,对吧?)

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

【讨论】:

以上是关于数据占用多少 RAM?的主要内容,如果未能解决你的问题,请参考以下文章

在实践中,C++11 中 std::atomic 的内存占用是多少?

如何衡量我的java应用程序占用多少内存

为啥我的程序在 64 GB RAM 系统上占用的 RAM 不超过 2 GB?

获取mysql的配置使用多少 RAM

如果洗牌,这个 5-d numpy 数组几乎不占用 RAM

GPU RAM 已占用但没有 PID