Pandas中打印DataFrame副本或切片后内存占用升高,如何解决?
问题分析与解决方案
内存占用上升的原因
在VSCode的Jupyter Notebook中,所有单元格执行后的返回值都会自动存入内置的Out字典(比如Out[3]对应第3个单元格的执行结果)。不管你是直接打印DataFrame副本,还是用loc/iloc/filter做切片,只要这些操作的结果作为单元格的返回值存在,就会被Out持有引用——Python的垃圾回收机制不会回收被引用的对象,所以内存占用会持续上升。
你疑惑“为何不直接打印切片结果”,本质是Jupyter的默认行为:只要单元格最后一行是有返回值的表达式(比如df.loc[...]本身就会返回一个DataFrame),Jupyter不仅会帮你显示这个结果,还会把它存到Out里留着后续可能调用,这就导致内存被额外占用。
避免Out保存结果的方法
这里有几个实用的解决办法:
- 在单元格末尾加分号
;:这是最常用的方式。执行切片或打印后加个分号,Jupyter就不会将结果存入Out:df.loc[df['value'] > 100]; # 或者结合print print(df.filter(items=['col1', 'col2'])); - 用
print()包裹操作,确保无返回值:如果单元格最后一行是print()语句,它的返回值是None,Out里只会存None,不会保留切片后的DataFrame:print(df.iloc[0:100]) - 手动清理
Out字典:如果已经产生了大量占用内存的Out对象,可以用魔法命令清空:
或者删除指定单元格的%reset out # 清空所有Out中的结果Out记录,再强制垃圾回收:del Out[5] # 删除第5个单元格的结果 import gc gc.collect() # 强制触发垃圾回收
内容的提问来源于stack exchange,提问作者juanmac
相关产品推荐
相关产品推荐

