Python与CSharp之间内存共享互传信息
一
C#写入字符串到共享内存
try
{
# 长度
long t = 100 ;
# 创建内存块,test1,其他语言利用这个内存块名字就能找到内存块。
var mmf = MemoryMappedFile. CreateOrOpen ( "test1" , t, MemoryMappedFileAccess. ReadWrite) ;
var viewAccessor = mmf. CreateViewAccessor ( 0 , t) ;
string s = "123" ;
viewAccessor. Write ( 0 , s. Length) ; ;
viewAccessor. WriteArray < byte > ( 0 , System. Text. Encoding. Default. GetBytes ( s) , 0 , s. Length) ;
}
catch ( System. Exception s)
{
MessageBox. Show ( s. Message) ;
}
Python从共享内存中读取
import mmap
str = '123 '
byte = str. encode ( )
SHMEMSIZE = len ( str)
file_name = 'test1'
print ( SHMEMSIZE)
# python读取共享内存
shmem = mmap. mmap( 0, SHMEMSIZE, file_name, mmap. ACCESS_READ)
print ( shmem. read ( SHMEMSIZE) . decode ( 'ASCII') )
shmem. close ( )
二
Python写入字符串到共享内存
import mmap
str = '123456 '
byte = str. encode ( encoding= 'UTF- 8 ')
SHMEMSIZE = len ( str)
file_name = 'global_share_memory'
print ( file_name)
# python写入共享内存
shmem = mmap. mmap( 0, SHMEMSIZE, file_name, mmap. ACCESS_WRITE)
shmem. write ( byte )
while True:
pass
C#从共享内存中读取
long capacity = 6 ;
var mmf = MemoryMappedFile. OpenExisting ( "global_share_memory" ) ;
MemoryMappedViewAccessor viewAccessor = mmf. CreateViewAccessor ( 0 , capacity) ;
char [ ] charsInMMf = new char [ 6 ] ;
byte test = viewAccessor. ReadByte ( 0 ) ;
byte test2 = viewAccessor. ReadByte ( 1 ) ;
byte test3 = viewAccessor. ReadByte ( 2 ) ;
byte test4 = viewAccessor. ReadByte ( 3 ) ;
实例
import torch
from net. LinkNet import linknet
import datetime
from 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 )
import mmap
strdd = '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" )
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< byte> ( 0 , System. Text. Encoding. Default. GetBytes( cmd) , 0 , cmd. Length) ;
}
// 调用算法
Bitmap b = new Bitmap( "test.bmp" ) ;
MemoryStream ms = new MemoryStream( ) ;
b. Save( ms, System. Drawing. Imaging. ImageFormat. Bmp) ;
byte[ ] bytes = ms. GetBuffer( ) ; // byte[ ] bytes = ms. ToArray( ) ;
ms. Close( ) ;
var mmf = MemoryMappedFile. CreateOrOpen( "test1" , bytes . Length, MemoryMappedFileAccess. ReadWrite) ;
var viewAccessor = mmf. CreateViewAccessor( 0 , bytes . Length) ;
viewAccessor. Write( 0 , bytes . Length) ; ;
viewAccessor. WriteArray< byte> ( 0 , bytes , 0 , bytes . Length) ;
test4w( "1" ) ;
MessageBox. Show( "write ok! ImageSize:" + bytes . Length. ToString( ) ) ;
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< char> ( 4 , charsInMMf, 0 , strLength) ;
MessageBox. Show( new string( charsInMMf) ) ;
public void MMF4Write( string blockName , string content)
{
try
{
long t = 1 << 10 << 10 ;
var mmf = MemoryMappedFile. CreateOrOpen( blockName, t, MemoryMappedFileAccess. ReadWrite) ;
var viewAccessor = mmf. CreateViewAccessor( 0 , t) ;
viewAccessor. Write( 0 , content. Length) ;
viewAccessor. WriteArray< char> ( 4 , content. ToArray( ) , 0 , content. Length) ;
}
catch ( System. Exception s)
{
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 ] { 1 , 2 } ;
// viewAccessor2. ReadArray< byte> ( 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, MemoryMappedFileAccess. ReadWrite) ;
var viewAccessor = mmf. CreateViewAccessor( 0 , imgBytes. Length) ;
viewAccessor. Write( 0 , imgBytes. Length) ; ;
viewAccessor. WriteArray< byte> ( 0 , imgBytes, 0 , imgBytes. Length) ;
}
catch ( System. Exception s)
{
MessageBox. Show( "写入图像失败!" ) ;
MessageBox. Show( s. Message) ;
}
}
实例
import torch
import cv2
from net. LinkNet import linknet
import numpy as np
import matplotlib. pyplot as plt
from 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 )
import mmap
shmem = mmap. mmap( 0 , 2 , "Result_Test" , mmap. ACCESS_WRITE)
shmem. write( "ma" . encode( encoding= 'ASCII' ) )
while True :
'''
1.检测调用算法Flag
'''
shmem = mmap. mmap( 0 , 1 , 'AlgorithmFlag' , mmap. ACCESS_READ)
AlgorithmFlag = shmem. read( 1 ) . decode( 'ASCII' )
AlgorithmFlag = str ( AlgorithmFlag)
if ( AlgorithmFlag== "1" ) :
'''
2.1 读取图像数据
'''
startTime = datetime. now( )
f = mmap. mmap( 0 , 1921078 , "img1" , mmap. ACCESS_READ)
img = cv2. imdecode( np. frombuffer( f, np. uint8) , cv2. IMREAD_COLOR)
'''
2.2 算法处理
'''
out = net( inputs)
'''
2.4 写入算法结果到物理内存块
'''
res = 'OK,0.02'
shmem2 = mmap. mmap( 0 , len ( res) , "Result_Test" , mmap. ACCESS_WRITE)
shmem2. write( res. encode( encoding= 'ASCII' ) )
print ( "算法结果已写入" )
'''
2.x 设置算法结束Flag
'''
shmem = mmap. mmap( 0 , 1 , "AlgorithmFlag" , mmap. ACCESS_WRITE)
shmem. write( '5' . encode( encoding= 'ASCII' ) )
'''
计算耗时
'''
endTime = datetime. now( )
strTime = 'funtion time use:%dms' % (
( endTime - startTime) . seconds * 1000 + ( endTime - startTime) . microseconds / 1000 )
print ( strTime)
// 1 . 读取图像
byte[ ] bytes = Bitmap2bytes( "test.bmp" ) ;
// 3 . 图像写入内存块
MMF4WriteImage( "img1" , bytes ) ;
// 4 . 写入, 结束flag
MMF4Write( "AlgorithmFlag" , "1" ) ;
// 5 . 等待python处理结束flag
while ( true)
{
// long capacity = 6 ;
// var mmf2 = MemoryMappedFile. OpenExisting( "AlgorithmFlag" ) ;
// MemoryMappedViewAccessor viewAccessor2 = mmf2. CreateViewAccessor( 0 , capacity) ;
// byte AlgorithmFlag = viewAccessor. ReadByte( 0 ) ;
// AddLog( 0 , client + ": " + AlgorithmFlag. ToString( ) ) ;
string res = MMF4Read( "AlgorithmFlag" , 1 ) ;
if ( res == "5" )
{
string res2 = MMF4Read( "Result_Test" , 7 ) ;
MessageBox. Show( res2) ;
break ;
}
Thread. Sleep( 1 ) ;
}
public void MMF4Write( string blockName , string content)
{
try
{
var mmf = MemoryMappedFile. CreateOrOpen( blockName, 999 , MemoryMappedFileAccess. ReadWrite) ;
byte[ ] byteArray = System. Text. Encoding. ASCII. GetBytes( content) ;
var viewAccessor = mmf. CreateViewAccessor( 0 , byteArray. Length) ;
viewAccessor. WriteArray< byte> ( 0 , byteArray, 0 , byteArray. Length) ;
}
catch ( System. Exception s)
{
MessageBox. Show( "写入失败!" ) ;
MessageBox. Show( s. Message) ;
}
}
public string MMF4Read( string blockName, int contentLength)
{
try
{
long capacity = 666 ;
var mmf = MemoryMappedFile. OpenExisting( blockName) ;
MemoryMappedViewAccessor viewAccessor = mmf. CreateViewAccessor( 0 , capacity) ;
byte[ ] bytes = new byte[ contentLength] ;
viewAccessor. ReadArray< byte> ( 0 , bytes , 0 , bytes . Length) ;
string msg = Encoding. ASCII. GetString( bytes ) ;
// mmf. Dispose( ) ;
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< byte> ( 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) ;
// 2 . 转为bytes
byte[ ] bytes = ms. GetBuffer( ) ; // byte[ ] bytes = ms. ToArray( ) ;
ms. Close( ) ;
return bytes ;
}