百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

持久化 Python 会话:实现数据持久化和可重用性

itomcoil 2025-09-13 01:15 1 浏览

Midjourney 生成

R语言会话持久化

熟悉或常用R语言进行数据分析/数据挖掘/数据建模的数据工作者可能对R语言的会话保存和会话恢复印象比较深刻,它可以将当前session会话持久化保存,以便分享给其他人开展后续的分析工作,而不需要重新执行前面的内容(前面数据处理过程可能很费时间),从而大大降低处理时间并提升效率。

RData 文件和 save.image() 函数的核心意义是提供一种方便的方式来保存和加载 R 会话的工作空间。它们的核心意义有以下几点:

  1. 持久化工作空间:RData 文件和 save.image() 函数允许你将当前会话的工作空间保存到硬盘上的文件中。这样,你可以在不同的时间点或不同的计算机上恢复保存时的工作环境。这对于长期项目、复杂分析和需要重复运行相同代码的情况非常有用。你可以保存数据、函数、变量和其他对象,以便将来使用。
  2. 环境共享和迁移:通过保存和加载工作空间,你可以方便地共享代码和数据,并在不同的 R 会话之间共享环境。这对于团队合作、结果复现和共享分析成果非常有帮助。你可以将工作空间发送给其他人,或在不同的计算机之间迁移工作环境,而无需手动重新创建对象和设置环境。
  3. 提高工作效率: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 使用。

相关推荐

python数据分析中你必须知道的陷阱和技巧

数据分析是一门既有趣又有挑战的技能,它可以帮助我们从海量的数据中提取有价值的信息,为决策提供支持。但是,数据分析也不是一件轻松的事情,它需要我们掌握一定的编程、统计、可视化等知识,同时也要注意避免一些...

python常见五大坑及避坑指南_python解决什么问题

python是一门非常流行和强大的编程语言,但是也有一些容易让初学者或者不熟悉的人掉入的坑。这里列举了一些python常见五大坑,以及如何避免或者解决它们。缩进问题。python使用缩进来表示代码块,...

收藏!2022年国家职业资格考试时间表公布

人社部14日公布2022年度专业技术人员职业资格考试工作计划,包括中小学生教师资格、会计师、精算师、建造师等各项考试日期。其中,证券期货基金业从业人员资格各次考试地点不同,具体安排以相关行业协会考试公...

苹果mac系统必须安装python3_macbook安装python3.7

苹果mac系统必须安装python3苹果mac系统口碑很好,但不能像linux系统一样同时提供python2和python3环境,对程序员来说是非常不友善的。资深程序员都知道,Python3才是P...

通过python实现猴子吃桃问题_python小猴子吃桃的问题

1、问题描述:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,就只剩...

python 中的第一个 hello world 程序输出

程序运行:print("helloworld")我使用的是Python程序3.7.0版本介绍下print概念print字面意思打印,将文本输出内容打印出来输入:print(&...

持久化 Python 会话:实现数据持久化和可重用性

Midjourney生成R语言会话持久化熟悉或常用R语言进行数据分析/数据挖掘/数据建模的数据工作者可能对R语言的会话保存和会话恢复印象比较深刻,它可以将当前session会话持久化保存,以便分...

如何将Python算法模型注册成Spark UDF函数实现全景模型部署

背景Background对于算法业务团队来说,将训练好的模型部署成服务的业务场景是非常常见的。通常会应用于三个场景:部署到流式程序里,比如风控需要通过流式处理来实时监控。部署到批任务中部署成API服...

Python 字典l转换成 JSON_python转化字典

本文需要5分钟。如果对您有用可以点赞评论关注.Python字典到JSONJSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,它基于ECMAScrip...

[python] 基于PyOD库实现数据异常检测

PyOD是一个全面且易于使用的Python库,专门用于检测多变量数据中的异常点或离群点。异常点是指那些与大多数数据点显著不同的数据,它们可能表示错误、噪声或潜在的有趣现象。无论是处理小规模项目还是大型...

总结90条写Python程序的建议_python写程序的步骤

  1.首先  建议1、理解Pythonic概念—-详见Python中的《Python之禅》  建议2、编写Pythonic代码  (1)避免不规范代码,比如只用大小写区分变量、使用容易...

ptrade系列第六天:持久化处理2_持久化的三种状态

前一次跟大家分享了利用pickle进行策略数据的持久化。但是这种方式有个问题,就是保存下来的数据无法很直观的看到,比较不方便,所以今天给大家带来另一种方式,将数据通过json保存。importjso...

Python数据持久化:JSON_python的json用法

编程派微信号:codingpy上周更新的《ThinkPython2e》第14章讲述了几种数据持久化的方式,包括dbm、pickle等,但是考虑到篇幅和读者等因素,并没有将各种方式都列全。本文将介绍...

干货 | 如何利用Python处理JSON格式的数据,建议收藏

作者:俊欣来源:关于数据分析与可视化JSON数据格式在我们的日常工作中经常会接触到,无论是做爬虫开发还是一般的数据分析处理,今天,小编就来分享一下当数据接口是JSON格式时,如何进行数据处理进行详...

Python中Pyyaml模块的使用_python模块介绍

一、YAML是什么YAML是专门用来写配置文件的语言,远比JSON格式方便。YAML语言的设计目标,就是方便人类读写。YAML是一种比XML和JSON更轻的文件格式,也更简单更强大,它可以通过缩进来表...