持久化 Python 会话:实现数据持久化和可重用性
wptr33 2025-07-10 21:26 25 浏览
Midjourney 生成
R语言会话持久化
熟悉或常用R语言进行数据分析/数据挖掘/数据建模的数据工作者可能对R语言的会话保存和会话恢复印象比较深刻,它可以将当前session会话持久化保存,以便分享给其他人开展后续的分析工作,而不需要重新执行前面的内容(前面数据处理过程可能很费时间),从而大大降低处理时间并提升效率。
RData 文件和 save.image() 函数的核心意义是提供一种方便的方式来保存和加载 R 会话的工作空间。它们的核心意义有以下几点:
- 持久化工作空间:RData 文件和 save.image() 函数允许你将当前会话的工作空间保存到硬盘上的文件中。这样,你可以在不同的时间点或不同的计算机上恢复保存时的工作环境。这对于长期项目、复杂分析和需要重复运行相同代码的情况非常有用。你可以保存数据、函数、变量和其他对象,以便将来使用。
- 环境共享和迁移:通过保存和加载工作空间,你可以方便地共享代码和数据,并在不同的 R 会话之间共享环境。这对于团队合作、结果复现和共享分析成果非常有帮助。你可以将工作空间发送给其他人,或在不同的计算机之间迁移工作环境,而无需手动重新创建对象和设置环境。
- 提高工作效率:RData 文件和 save.image() 函数可以帮助你节省时间和努力。你可以将工作空间保存为文件,避免在每次启动 R 会话时重新加载数据和设置环境。这样,你可以快速回到之前的工作状态,继续进行分析或开发,而不必从头开始。
总而言之,RData 文件和 save.image() 函数的核心意义是提供一种简单而有效的方法来保存和加载 R 会话的工作空间,以方便地保留和共享环境,节省时间并提高工作效率。
Python会话如何持久化?
持久化和恢复Python 对大数据处理(Data PipeLine)框架由比较大意义。
大数据应用的典型范式是由数据管道(Data PipeLine)组成的一系列数据加工处理和应用的过程,主流数据管道处理框架如批处理、流处理管道和Lambda架构。在这些数据管道中,Python 在数据处理和应用方面的应用越来越广泛,并成为主流的计算方式。Python 可以用于控制批处理部分的逻辑控制(与数据平台交互),并很好地支持交互数据应用部分,如交互报表和算法模型的预测服务。整个过程可以分为两部分:批处理部分(数据加工过程)和交互数据应用部分。
关于这两部分如何更好地结合,有两种方式:
- 分离方式:在这种方式下,批处理部分和交互数据应用部分是相互分离的。批处理部分负责数据加工和持久化,将结果存储在数据库或其他持久化数据存储中。交互数据应用部分则从持久化数据中加载所需的数据,并进行交互式应用和分析。这种方式可以通过数据库查询或数据加载方式来关联两部分的数据。
- 统一方式:在这种方式下,整个过程是统一和一体的。批处理部分的结果会被持久化,然后交互数据应用部分加载批处理结果的会话(session),并进行交互式的应用。这种方式可以通过使用适当的工具和框架,如dill等,来实现会话的持久化和加载。
那如何在Python中实现类似于 R 的 save.image() 功能,将会话数据持久化,以便在需要时重新加载和重用?
接下来介绍一下笔者尝试使用dill 包实现session会话的保存和恢复,同时修复dill在Notebook中使用出现的bug。
关于dill
dill 是一个扩展了 Python 的 pickle 模块的库,用于序列化和反序列化 Python 对象,并具有保存解释器会话状态的功能。
GitHub地址:https://github.com/uqfoundation/dill
主要功能:
a. 序列化和反序列化 Python 对象到大多数内置 Python 类型。
b. 提供与 pickle 模块相同的用户界面,并具有一些附加功能。
c. 能够保存解释器/Kernel会话的状态,以便在不同的解释器/Kernel会话之间恢复和继续执行。
d. 可以将 Python 对象作为字节流发送到网络上。
e. 允许对任意用户定义的类和函数进行序列化。
f. dill 是 pathos(pathos 是一个并行计算和多核编程的框架,旨在简化在多个计算资源上执行任务的过程。它提供了一组工具和接口,使得在分布式和并行计算环境中编写高效的代码更加容易) 框架的一部分,用于异构计算。
dill操作实例
- 安装dill
pip install dill
- 定义变量
import pandas as pd
import numpy as np
a=[100,'aa']
b={"x":100,"y":'200'}
df1 = pd.DataFrame({'A': np.arange(1,1000), 'B': np.arange(2,1001)})
df1
- 保存session 会话
import dill
filepath = 'session1.pkl'
dill.dump_module(filename=filepath)
- 关闭python 或kernel
- 重新进入python或重启kernel,加载session:
import dill
filepath = 'session1.pkl'
dill.load_module(filename=filepath)
df1
dill 在notebook上实例
通过测试发现,dill 在notebook上执行dump_module失败,经过排查主要由于IPython和ipykernel 相关socket对象无法持久化导致异常。IPython和ipykernel 主要kernel 与notebook 通信交互的相关包和对象,创建kernel 会自动生成无需持久化和恢复。
经排查和阅读dill 源代码,可以使用register重新注册dict 持久化类,先预处理过滤掉相关对象,再调用dill 内部snb_save_module_dict。代码参考如下:
from dill._dill import register
from dill._dill import save_module_dict
"""
dill 在notebook 里面无法正常使用,由于IPython和ipykernel 相关socket对象无法持久化,save pickl 时候需要过滤掉相关对象。
register 重新注册dict 持久化类,先预处理过滤掉,再调用dill 内部snb_save_module_dict。
"""
@register(dict)
def snb_save_module_dict(pickler, obj):
keys=list(obj.keys())
for k in keys:
if type(obj[k]).__module__.startswith("ipykernel.") or type(obj[k]).__module__.startswith("IPython."):
obj.pop(k,None)
else:
pass
#print(k,obj[k])
save_module_dict(pickler, obj)
经过测试,dill 可以完整在Notebook 使用。
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
