gpt4 book ai didi

python - 磁盘上有 70 MB 但内存中有 500 MB 的列表

转载 作者:太空狗 更新时间:2023-10-30 02:45:59 29 4
gpt4 key购买 nike

我有一个字符串元组的 python 列表,格式如下:lst = [('xxx', 'yyy'), ...etc]。该列表包含大约 8154741 个元组。我使用了一个分析器,它说该列表占用大约 500 MB 的内存。然后我将列表中的所有元组写入一个文本文件,这占用了大约 72MB 的磁盘空间。

我有三个问题:

  • 为什么内存消耗与磁盘使用不同?

  • 为这样的列表消耗 500MB 内存是否合乎逻辑?

  • 有没有办法/技术来减少列表的大小?

最佳答案

你有 8154741 元组,这意味着你的列表,假设 8 字节指针,已经包含 62 MB 的元组指针。假设每个元组在 python2 中包含两个 ascii 字符串,那就是每个元组的另一个 124 MB 指针。然后你仍然有元组和字符串对象的开销,每个对象都有一个引用计数,假设这是一个 8 字节整数,你还有另一个 186 MB 的引用计数存储。这已经是 372 MB 的开销,对于 46 MB 的数据,您将拥有两个 3 字节长的字符串,大小为 2 元组。在 python3 下,您的数据是 unicode 并且每个字符也可能大于 1 个字节。

所以是的,预计这种类型的结构会消耗大量的多余内存。

如果您的字符串都具有相似的长度并且元组都具有相同的长度,那么减少这种情况的方法是使用 numpy 字符串数组。它们将字符串存储在一个连续的内存块中,避免了对象开销。但如果字符串的大小变化很大,这将不会很好地工作,因为 numpy 不支持参差不齐的数组。

>>> d = [("xxx", "yyy") for i in range(8154741)]
>>> a = numpy.array(d)
>>> print a.nbytes/1024**2
46
>>> print a[2,1]
yyy

关于python - 磁盘上有 70 MB 但内存中有 500 MB 的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22590892/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com