You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:45:07