方案一:使用 分布式内存计算框架
(推荐)Apache Ignite / Hazelcast
-
原理:
- 在每台计算机上部署内存节点
- 所有节点通过TCP/IP组成内存网格
- 应用程序通过API透明访问全局内存
-
部署步骤:
# 在两台电脑上均执行: # 1. 下载Apache Ignite Invoke-WebRequest https://archive.apache.org/dist/ignite/2.14.0/apache-ignite-2.14.0-bin.zip -OutFile ignite.zip Expand-Archive ignite.zip # 2. 启动节点(计算机A) .\apache-ignite-2.14.0-bin\bin\ignite.bat # 3. 启动节点(计算机B)指定A为种子节点 .\apache-ignite-2.14.0-bin\bin\ignite.bat -J-DIGNITE_DISCOVERY_ADDRESSES=192.168.1.100:47500
-
代码示例(C#):
var cfg = new IgniteConfiguration(); using var ignite = Ignition.Start(cfg); // 创建分布式缓存 var cache = ignite.GetOrCreateCache<int, double>("sharedCache"); // 计算机A写入 cache.Put(1, 123.45); // 计算机B读取 double value = cache.Get(1); // => 123.45
方案二:使用 内存映射文件 + 网络共享
(适合小型数据集)
-
设置步骤:
- 在计算机A创建共享文件夹(参考上一教程)
- 在计算机B映射网络驱动器
- 在两台电脑创建内存映射文件指向同一网络文件
-
C++ 实现核心代码:
// 计算机A (写入端) HANDLE hFile = CreateFile(L"\\\\PC-A\\Share\\data.bin", ...); HANDLE hMap = CreateFileMapping(hFile, ..., PAGE_READWRITE, 0, 1024, NULL); double* pData = (double*)MapViewOfFile(hMap, FILE_MAP_WRITE, ...); pData[0] = 3.14159; // 写入共享数据
// 计算机B (读取端) double* pShared = (double*)MapViewOfFile(...); // 映射同一文件 printf("%f", pShared[0]); // 读取A写入的数据
-
限制:
- 需要手动同步写入
- 网络延迟影响性能
- 文件锁可能冲突
方案三:使用 RDMA (远程直接内存访问)
(高性能/需要特殊硬件)
-
硬件要求:
- Mellanox/Chelsio RDMA网卡(支持RoCE v2)
- 支持RDMA的交换机
-
Windows配置:
# 安装RDMA驱动 Install-WindowsFeature Data-Center-Bridging, FS-SMBBW # 启用SMB Direct Set-SmbServerConfiguration -EnableSMBdirect $true
-
性能特点:
- 延迟低于5μs
- 带宽可达100Gbps
- CPU占用接近0%
方案对比表
方案 | 适用场景 | 延迟 | 复杂度 | 硬件要求 |
---|---|---|---|---|
分布式内存网格 | 大规模并行计算 | 1-10ms | ★★★☆☆ | 标准以太网 |
内存映射文件+SMB | 小数据交换 | 100-500μs | ★★☆☆☆ | 任何网络 |
RDMA | HPC高性能计算 | <5μs | ★★★★☆ | 专用网卡/交换 |
实际选择建议:
- 开发便捷性 ➜ Apache Ignite/Hazelcast
- 低成本测试 ➜ 内存映射文件+SMB
- 超高性能需求 ➜ RDMA+InfiniBand
特殊场景解决方案
GPU内存共享(如NVIDIA GPU Direct)
# 启用GPUDirect RDMA
nvidia-smi -e 1 # 开启PCIe访问标志
需要:
- 支持GPUDirect的Tesla/Quadro显卡
- Windows Server 2019+数据中心版
- Mellanox ConnectX系列网卡
通过上述方案,虽然无法真正"共享物理内存",但可在分布式系统层面实现内存数据的共享访问和协同计算。