Python存储大文本字符串时内存占用异常过高的技术问询
问题:CPython读取文本文件时字符串内存占用远超文件大小
处理大体积文本文件时,发现CPython将文件内容存储为字符串变量所需的内存远大于文件本身的大小,具体测试情况如下:
测试脚本
import time @profile def func(): with open('full_it_cc100/it.txt_part_0001.txt','r') as f: stringu = f.read() return stringu stringu = func() print("I HAVE STRINGU") time.sleep(3)
测试现象
- 文本模式(
'r')读取:500MB的意大利语文本文件,func()执行完成后内存占用达2GB,字符串内存占用为原文件的4倍,远超预期 - 二进制模式(
'rb')读取:内存占用为600MB,结果符合预期
环境与补充数据
使用CPython 3.10.11环境,针对意大利语文本文件,执行以下代码的输出:
print(len(stringu)): 517122251print(stringu.__sizeof__()): 2068489080- 字符串包含的Unicode码点:覆盖ASCII(0-126)、非断空格(160)以及Latin-1扩展字符(224-255)
补充测试(英语文本)
测试500MB英语文本文件时,内存占用约1GB,对应输出:
print(len(stringu)): 523598410print(stringu.__sizeof__()): 1047196894- 字符串包含的Unicode码点:以ASCII为主,仅少量扩展字符
疑问
是否仅由编码方式导致内存膨胀?但4倍的幅度明显过高,怀疑意大利语文件的字符组成或数据集特性还有其他影响因素,后续会进一步测试。
复现方法
- 安装依赖:
pip install memory-profiler - 运行脚本:
mprof run script_name.py;也可移除@profile装饰器直接运行脚本
内容的提问来源于stack exchange,提问作者Frotaur
相关产品推荐
相关产品推荐

