Python:写入文件时的内存使用情况(生成器与列表)

标签 python list memory-management generator

我正在尝试从大型 tarball 文件创建文件名列表,我想了解为什么我的示例中的内存使用情况仍然相同?是因为在文件实际关闭之前 f.write() 仍在内存中保存/缓冲所有对象吗?有没有办法改善这个问题?

# touch file{1..100000}.txt
# tar cf test.tar file*

生成器

# python test.py 
Memory (Before): 40.918MB
Memory (After): 117.066MB
It took 12.636950492858887 seconds.

列表:

# python test.py
Memory (Before): 40.918MB
Memory (After): 117.832MB
It took 12.049121856689453 seconds.

测试.py

#!/usr/bin/python3

import memory_profiler
import tarfile
import time


def files_generator(tar):
    entry = tar.next()
    while entry:
        yield entry.name
        entry = tar.next()

def files_list(tar):
    return tar.getnames()

if __name__ == '__main__':
    print(f'Memory (Before): {memory_profiler.memory_usage()[0]:.3f}MB')
    start = time.time()
    tar = tarfile.open('test.tar')
    with open('output_g.txt', 'w') as f:
        for i in files_generator(tar):
        #for i in files_list(tar):
            f.write(i + '\n')
    end = time.time()
    print(f'Memory (After): {memory_profiler.memory_usage()[0]:.3f}MB')
    print(f'It took {end-start} seconds.')

最佳答案

Tarfile.next() 方法缓存其内容,including the lines :

if tarinfo is not None: 
    self.members.append(tarinfo)

事实证明,Tarfile.getnames() 调用Tarfile.getmembers(),后者又调用 Tarfile._load(),后者重复调用 Tarfile.next() 直到所有内容都读入 self.members。因此 Tarfile.getnames() 和通过 Tarfile.next() 进行迭代将具有相同的内存使用量。

关于Python:写入文件时的内存使用情况(生成器与列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52223756/

相关文章:

python - requests/httplib/urllib 返回 3 个不同的结果

python - 查找两个可迭代对象共享的匹配值数量的更有效方法?

c# - 保持我的列表/词典在全局范围内可访问

c - 在函数中释放内存

python - 最小化到托盘,陷入循环,python gtk

python - True == True != False 在 Python 中是什么意思以及如何找出?

python - 从 RSA key 数据 XML 中的模数和 D 获取私钥

python - 如何在 Python 中仅使用列表而不使用字典将城市与国家/地区关联起来?

memory-management - Linux 中 APIC 函数的帮助

c++ - 为什么 boost::thread 可以被删除两次?