python - 为什么作为列表的文本表示会消耗如此多的内存?

标签 python memory

我有一个 335 MB 的大文本文件。整个文本被标记化。每个标记由空格分隔。我想将每个句子表示为一个单词列表,而整个文本是一个句子列表。这意味着我将获得列表列表。

我使用这段简单的代码将文本加载到我的主内存中:

def get_tokenized_text(file_name):
    tokens = list()
    with open(file_name,'rt') as f:
        sentences = f.readlines()

    return [sent.strip().split(' ') for sent in sentences]

不幸的是,这种方法消耗了太多内存,以至于我的笔记本电脑总是死机。我有 4 GB RAM,但大约五秒钟后它就拥塞了。

为什么?文本应占用约 335 MB。即使我很慷慨而且我已经批准让我们说四倍的内存只用于管理内容,也没有内存拥塞的原因。我现在是否有任何内存泄漏?

最佳答案

列表和字符串是对象,对象具有占用内存空间的属性。您可以使用 sys.getsizeof 检查对象的大小和开销:

>>> sys.getsizeof('')
49
>>> sys.getsizeof('abcd')
53
>>> sys.getsizeof([])
64
>>> sys.getsizeof(['a'])
72
>>> sys.getsizeof(['a', 'b'])
80

关于python - 为什么作为列表的文本表示会消耗如此多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37846284/

相关文章:

python - 有没有一种简单的方法来获取 python 私有(private)堆大小?

java - 如何使 Java 应用程序的内存高效?

python - 什么是组合相关但存储在不同数据帧中的数据集的好设计模式?

python - Python 中的参数和参数如何工作?

memory - 对象的 Redis 编码和大小影响

arrays - 和 friend 一起研究C语言动态分配malloc realloc。但是有一个问题。我考虑内存设置

c++ - 32B block ,连续和非连续内存访问

python - 继承的公共(public)方法是否可以从 Pylint 的统计数据中排除?

python - 使用 requests-html 解析元素的尾部

python - 如何解决TypeError : 'str' does not support the buffer interface?