1.创建一个浮点二维数组,并转换为字节数组
[HttpPost(Name = "SavePLYArrayToMemory")]
public async Task<string> SavePLYArrayToMemory()
{
int count = 10000001;
Random random = new Random();
double[,] myArray = new double[count, 3];
for (int i = 0; i < count; i++)
{
myArray[i, 0] = random.NextDouble();
myArray[i, 1] = random.NextDouble();
myArray[i, 2] = random.NextDouble();
}
byte[] s = LinkAsiaSmart.Utils.Utils.ArrayUtil.ConvertToByteArray(myArray);
Log.Logger.Debug($"保存点云到共享内存 FileName = {GlobalConst.MemoryMap.TireGlueing} Size = {s.Length} Size = {myArray.Length}");
MemoryHelper.SaveGluePLYArrayToMemory(GlobalConst.MemoryMap.TireGlueing, s);
return $"result {s.Length} {myArray.Length}";
}
2.浮点二维数组转字节数组
public class ArrayUtil
{
public static byte[] ConvertToByteArray(double[,] doubleArray)
{
int length = doubleArray.Length; // 获取数组总长度
byte[] byteArray = new byte[length * sizeof(double)]; // 创建字节数组
int index = 0;
for (int i = 0; i < doubleArray.GetLength(0); i++) // 假设数组是矩形的
{
for (int j = 0; j < doubleArray.GetLength(1); j++)
{
double value = doubleArray[i, j];
byte[] valueBytes = BitConverter.GetBytes(value);
valueBytes.CopyTo(byteArray, index);
index += valueBytes.Length;
}
}
return byteArray;
}
}
3.将字节数组保存到共享内存中
public static void SaveGluePLYArrayToMemory(string FileName, byte[] msg)
{
try
{
//# 长度
long t = msg.Length; // 100;// SetMemorySize(msg);// 100;
int size = msg.Length / (3*8);
//# 创建内存块,test1,其他语言利用这个内存块名字就能找到内存块。
var mmf = MemoryMappedFile.CreateOrOpen(FileName, t, MemoryMappedFileAccess.ReadWrite);
var viewAccessor = mmf.CreateViewAccessor(0, t);
viewAccessor.WriteArray<byte>(0, msg, 0, size);
// MessageBox.Show("write ok");
}
catch (System.Exception s)
{
MessageBox.Show(s.Message);
}
}
4.Python读取共享内存中的二维数组其中array就是读取出来的浮点二维数组
import ast
import copy
import datetime
import os
import random
import sys
import open3d as o3d;
import numpy as np
import pip;
import mmap
from multiprocessing import shared_memory
if __name__ == "__main__":
print("version")
print(sys.path)
print(o3d.__version__)
print(sys.version)
print(sys.executable)
print(pip.__version__)
print(pip.__file__)
print(sys.getwindowsversion())
try:
MemorySize = 240000024
count = MemorySize //(8*3)
file_name1 = 'TireGlueing'
#print(SHMEMSIZE)
# python读取共享内存
print(f'1. {datetime.datetime.now()}')
shmem1 = mmap.mmap(0, MemorySize, file_name1, mmap.ACCESS_READ)
#shmem1.read_byte
# np.frombuffer(shmem1, np.uint8)
array = np.frombuffer(shmem1, dtype=np.double, count=count * 3, offset=0)
array = array.reshape((count, 3))
print(array)
pointA = np.array(array)
#print(pointA)
GlueTopPly = o3d.geometry.PointCloud()
GlueTopPly.points = o3d.utility.Vector3dVector(pointA)
o3d.visualization.draw_geometries([GlueTopPly],
window_name = f"第 1区 " ,
width = 1280, height = 800, left = 50, top = 50)
except Exception as e:
print(e)
print('ok')
print("version end")