本文共 8112 字,大约阅读时间需要 27 分钟。
尝试以下代码:
long t = 100; // 内存块的大小var mmf = MemoryMappedFile.CreateOrOpen("test1", t, MemoryMappedFileAccess.ReadWrite); // 创建或打开内存映射文件var viewAccessor = mmf.CreateViewAccessor(0, t); // 创建内存视图访问器string s = "123";viewAccessor.Write(0, s.Length); // 写入长度viewAccessor.WriteArray (0, System.Text.Encoding.Default.GetBytes(s), 0, s.Length); // 写入字符串 如果出现错误会显示错误信息。
以下代码用于读取C#写入的字符串:
import mmapstr = '123'SHMEMSIZE = len(str)file_name = 'test1'print(SHMEMSIZE) # 输出内存块的大小# 读取共享内存shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_READ)print(shmem.read(SHMEMSIZE).decode('ASCII')) # 解码并输出字符串shmem.close() # 关闭内存映射 以下是一个完整的示例:
import torchfrom net.LinkNet import linknetimport numpy as npimport cv2# 创建输入数据inputs = torch.randn((1, 3, 512, 512))# 定义网络net = linknet(n_classes=8)# 前向传播out = net(inputs)# 输出大小print('-----' * 5)print(out.size())print('-----' * 5)# Python接受图片数据并写入共享内存import mmapstrdd = '1'byte = strdd.encode()SHMEMSIZE = len(strdd)file_name = 'CmdFlag'print(SHMEMSIZE)while True: # 读取共享内存 shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_READ) cmdFlag = shmem.read(SHMEMSIZE).decode('ASCII') cmdFlag = str(cmdFlag) if cmdFlag == "1": print("classify") flag001 = '9' byte = flag001.encode(encoding='ASCII') SHMEMSIZE = len(flag001) file_name = 'CmdFlag' # 写入共享内存 shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_WRITE) shmem.write(byte) elif cmdFlag == "2": print("seg") elif cmdFlag == "3": print("dect") 以下代码用于读取Python写入的字符串:
long capacity = 100;var mmf = MemoryMappedFile.OpenExisting("CmdFlag"); // 打开已存在的内存映射文件MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);char[] charsInMMf = new char[capacity]; // 初始化字符数组viewAccessor.ReadArray (0, charsInMMf, 0, capacity); // 读取字符数组string msg = new string(charsInMMf); // 将字符数组转换为字符串MessageBox.Show(msg); // 显示结果 以下代码扩展了内存映射的功能:
public void MMF4Write(string blockName, string content){ try { long t = 1 << 10; // 计算内存块的大小 var mmf = MemoryMappedFile.CreateOrOpen(blockName, t, MemoryMappedFileAccess.ReadWrite); var viewAccessor = mmf.CreateViewAccessor(0, t); viewAccessor.Write(0, content.Length); // 写入长度 viewAccessor.WriteArray (4, content.ToArray(), 0, content.Length); // 写入内容 } catch (System.Exception s) { MessageBox.Show("写入失败!"); MessageBox.Show(s.Message); }}public string MMF4Read(string blockName){ try { long capacity = 2; var mmf2 = MemoryMappedFile.OpenExisting(blockName); MemoryMappedViewAccessor viewAccessor2 = mmf2.CreateViewAccessor(0, capacity); byte[] charsInMMf = new byte[2] { (byte)1, (byte)2 }; viewAccessor2.ReadArray (0, charsInMMf, 0, 2); charsInMMf[0] = viewAccessor2.ReadByte(0); charsInMMf[1] = viewAccessor2.ReadByte(1); string msg = Encoding.UTF8.GetString(charsInMMf); return msg; } catch (System.Exception s) { MessageBox.Show(s.Message); return "fail"; }}public void MMF4WriteImage(string blockName, byte[] imgBytes){ try { var mmf = MemoryMappedFile.CreateOrOpen("img1", imgBytes.Length + 1000, MemoryMappedFileAccess.ReadWrite); var viewAccessor = mmf.CreateViewAccessor(0, imgBytes.Length); viewAccessor.WriteArray (0, imgBytes, 0, imgBytes.Length); } catch (System.Exception s) { MessageBox.Show("写入图像失败!"); MessageBox.Show(s.Message); }}public byte[] Bitmap2bytes(string imgPath){ Bitmap b = new Bitmap(imgPath); MemoryStream ms = new MemoryStream(); b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); byte[] bytes = ms.GetBuffer(); ms.Close(); return bytes;} 以下是一个完整的实例:
import torchimport cv2from net.LinkNet import linknetimport numpy as npimport matplotlib.pyplot as pltfrom datetime import datetime# 创建输入数据inputs = torch.randn((1, 3, 512, 512))# 定义网络net = linknet(n_classes=8)# 前向传播out = net(inputs)# 打印输出大小print('-----' * 5)print(out.size())print('-----' * 5)# Python接受图片数据并写入共享内存import mmapshmem = mmap.mmap(0, 2, "Result_Test", mmap.ACCESS_WRITE)shmem.write("ma".encode(encoding='ASCII'))while True: # 读取共享内存中的标志 shmem_flag = mmap.mmap(0, 1, 'AlgorithmFlag', mmap.ACCESS_READ) AlgorithmFlag = shmem_flag.read(1).decode('ASCII') AlgorithmFlag = str(AlgorithmFlag) if AlgorithmFlag == "1": # 读取图像数据 img_map = mmap.mmap(0, 1921078, "img1", mmap.ACCESS_READ) img = cv2.imdecode(np.frombuffer(img_map, np.uint8), cv2.IMREAD_COLOR) # 算法处理 out = net(inputs) # 写入算法结果到共享内存 result_map = mmap.mmap(0, len("OK,0.02"), "Result_Test", mmap.ACCESS_WRITE) result_map.write("OK,0.02".encode(encoding='ASCII')) print("算法结果已写入") # 设置算法结束标志 end_flag_map = mmap.mmap(0, 1, "A1_FinishFlag", mmap.ACCESS_WRITE) end_flag_map.write('-1'.encode(encoding='ASCII')) # 计算耗时 startTime = datetime.now() endTime = datetime.now() strTime = '函数时间用时:%dms' % ( (endTime - startTime).seconds * 1000 + (endTime - startTime).microseconds / 1000 ) print(strTime) elif AlgorithmFlag == "2": print("Segmentation") elif AlgorithmFlag == "3": print("Decomposition") 以下代码用于在C#中调用Python算法:
public void test4w(string cmd){ long t = 100; var mmf = MemoryMappedFile.CreateOrOpen("CmdFlag", t, MemoryMappedFileAccess.ReadWrite); var viewAccessor = mmf.CreateViewAccessor(0, t); viewAccessor.Write(0, cmd.Length); viewAccessor.WriteArray (0, System.Text.Encoding.Default.GetBytes(cmd), 0, cmd.Length);}public void MMF4Write(string blockName, string content){ try { long t = 1 << 10; var mmf = MemoryMappedFile.CreateOrOpen(blockName, t, MemoryMappedFileAccess.ReadWrite); var viewAccessor = mmf.CreateViewAccessor(0, t); viewAccessor.Write(0, content.Length); viewAccessor.WriteArray (4, content.ToArray(), 0, content.Length); } catch (System.Exception s) { MessageBox.Show("写入失败!"); MessageBox.Show(s.Message); }}public string MMF4Read(string blockName){ try { long capacity = 2; var mmf2 = MemoryMappedFile.OpenExisting(blockName); MemoryMappedViewAccessor viewAccessor2 = mmf2.CreateViewAccessor(0, capacity); byte[] bytes = new byte[2] { (byte)1, (byte)2 }; viewAccessor2.ReadArray (0, bytes, 0, 2); bytes[0] = viewAccessor2.ReadByte(0); bytes[1] = viewAccessor2.ReadByte(1); string msg = Encoding.UTF8.GetString(bytes); return msg; } catch (System.Exception s) { MessageBox.Show(s.Message); return "fail"; }}public void MMF4WriteImage(string blockName, byte[] imgBytes){ try { var mmf = MemoryMappedFile.CreateOrOpen("img1", imgBytes.Length + 1000, MemoryMappedFileAccess.ReadWrite); var viewAccessor = mmf.CreateViewAccessor(0, imgBytes.Length); viewAccessor.WriteArray (0, imgBytes, 0, imgBytes.Length); } catch (System.Exception s) { MessageBox.Show("写入图像失败!"); MessageBox.Show(s.Message); }}public byte[] Bitmap2bytes(string imgPath){ Bitmap b = new Bitmap(imgPath); MemoryStream ms = new MemoryStream(); b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); byte[] bytes = ms.GetBuffer(); ms.Close(); return bytes;} 以下代码实现了图像传输与处理:
long capacity = 666;var mmf = MemoryMappedFile.OpenExisting("Result");MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);int strLength = viewAccessor.ReadInt32(0);char[] charsInMMf = new char[strLength];viewAccessor.ReadArray (4, charsInMMf, 0, strLength);MessageBox.Show(new string(charsInMMf)); 通过上述方法,我们成功实现了Python与C#之间的内存共享与数据互传。C#可以写入字符串到共享内存,Python可以从共享内存中读取字符串。同时,Python也可以写入字符串到共享内存,C#可以读取字符串。通过这些方法,我们可以实现高效的数据交互和内存管理。
转载地址:http://fnlfk.baihongyu.com/