Python3.11下多Jupyter Notebook如何共享已读取的Pandas DataFrame?
多Jupyter Notebook共享已读取的大型DataFrame解决方案
针对你多个Notebook重复读取大型CSV造成资源浪费的问题,以下是几种高效的解决方案,按易用性和场景适配性排序:
1. 序列化到高效格式后跨Notebook加载
这是最易实现、兼容性最好的方案,将读取后的DataFrame保存为二进制格式,其他Notebook直接加载该文件——速度远快于读取CSV,且内存占用更低。
- 主Notebook(仅执行一次):
import pandas as pd # 读取原始CSV df = pd.read_csv('/home/data/bigi.csv') # 保存为Parquet格式(高压缩率、快加载速度) df.to_parquet('/home/data/bigi.parquet', compression='snappy')
- 其他Notebook直接加载:
import pandas as pd # 加载Parquet文件,速度比CSV快数倍 df = pd.read_parquet('/home/data/bigi.parquet')
优点:无需额外配置,文件可长期复用;缺点:会占用少量磁盘空间(Parquet压缩率通常远高于CSV,实际占用很少)。
2. 使用IPython跨内核共享变量(ipyparallel)
适合需要实时共享、不想占用磁盘的场景,通过IPython并行框架实现内核间的变量共享。
步骤1:启动ipyparallel集群
在终端执行:
ipcluster start -n 4 # 启动1个控制器和4个引擎(数量按需调整)
步骤2:主Notebook注册共享DataFrame
import pandas as pd from ipyparallel import Client # 连接到控制器 rc = Client() dv = rc[:] # 获取所有引擎的视图 # 读取CSV并广播到所有引擎 df = pd.read_csv('/home/data/bigi.csv') dv['shared_df'] = df
步骤3:其他Notebook获取共享DataFrame
from ipyparallel import Client rc = Client() dv = rc[:] # 从引擎获取共享DataFrame df = dv['shared_df']
优点:无需磁盘存储,实时共享;缺点:需提前启动集群,Notebook关闭后共享变量失效。
3. 操作系统级共享内存(极致内存优化)
适合对内存使用要求极高的场景,让多个进程直接访问同一块内存区域,完全避免数据复制。
使用multiprocessing.SharedMemory(Python 3.8+)
- 主Notebook:
import pandas as pd import numpy as np from multiprocessing import SharedMemory # 读取CSV并转为numpy数组 df = pd.read_csv('/home/data/bigi.csv') arr = df.to_numpy() # 创建共享内存 shm = SharedMemory(create=True, size=arr.nbytes) # 将数组关联到共享内存 shared_arr = np.ndarray(arr.shape, dtype=arr.dtype, buffer=shm.buf) shared_arr[:] = arr[:] # 记录关键信息,需要传递给其他Notebook print(f"共享内存名称: {shm.name}") print(f"数组形状: {arr.shape}") print(f"数组类型: {arr.dtype}") print(f"原CSV列名: {df.columns.tolist()}")
- 其他Notebook:
import pandas as pd import numpy as np from multiprocessing import SharedMemory # 替换为主Notebook输出的信息 shm_name = "填入主Notebook的共享内存名称" arr_shape = (填入数组形状, 比如1000000, 20) arr_dtype = np.dtype("填入数据类型, 比如float64") col_names = ["列名1", "列名2", ...] # 连接到已有共享内存 shm = SharedMemory(name=shm_name, create=False) # 重建numpy数组 shared_arr = np.ndarray(arr_shape, dtype=arr_dtype, buffer=shm.buf) # 转回DataFrame df = pd.DataFrame(shared_arr, columns=col_names)
优点:零数据复制,内存使用效率最高;缺点:需手动管理共享内存生命周期,列名需单独传递,实现复杂度较高。
内容的提问来源于stack exchange,提问作者user15343999
相关产品推荐
相关产品推荐

