python - Python:写入文件时的内存使用情况(生成器与列表)
问题描述
我正在尝试从一个大的 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()
方法缓存其内容,包括以下行:
if tarinfo is not None:
self.members.append(tarinfo)
事实证明,Tarfile.getnames()
调用Tarfile.getmembers()
which 调用Tarfile._load()
which 重复调用Tarfile.next()
,直到全部读入self.members
. 因此Tarfile.getnames()
,通过迭代Tarfile.next()
将具有相同的内存使用量。
推荐阅读
- c - 无法在 If 语句中检索或存储二维数组位置
- css - 如何在 Vuetify 中更改文本字段的宽度和高度?
- c# - Unity:使用两个摄像头对单个图层进行灰度化也会对天空盒进行灰度化?
- c - 字节顺序和位移问题
- javascript - 在一个 td 中显示数组项目,每个项目在新行上
- tensorflow - 函数 model.fit() 中的错误不兼容形状
- python - tensorflow找到到真实点的最小距离
- node.js - Angular8 和 webpack4:未捕获的 ReferenceError:vendor_lib 未定义和源映射错误
- javascript - 点击后运行函数
- python - 如何检查特定字符串长度的日志文件并在 Python 中调用下游函数