2017-11-05 1 views
0

ctypes 객체를 C++과 파이썬 프로세스간에 공유했습니다. 파이썬 프로세스는 그 객체로부터 입력 값을 받아 Tensorflow를 통해 실행하고, numpy 배열을 출력으로 남겨 둡니다. 이 배열은 상당히 커서 텍트로 플로우 출력에서 ​​공유 된 ctypes 객체로 데이터를 복사하는 더 좋은 방법이 있는지 궁금합니다. 그래서 C++ 프로세스가 데이터를 처리 할 수 ​​있습니다. (속도는 예,이 문제입니다.) 지금 내가 한 각 값을 복사하고있어데이터를 numpy에서 ctypes로 빠르게 복사

: 데이터가하는 ctypes가 메모리에 공유 객체입니다

output = np.array([12, 13, 11, 10]) # in reality this is fairly large (the Tensorflow result) 
for i, value in enumerate(output): 
    data.pressure[i] = ctypes.c_double(value) 

. (this example 이후 구조)

한편, ctypes 개체에서 numpy로 데이터를 복사하는 것은 쉽습니다. 반대쪽 (ctypes 배열에 numpy에서)하는 것이 있는지 궁금합니다. 쉬운 코드입니다. :

# Creating a numpy array from the ctypes array 
input = np.reshape(data.velocity, (1, 29791)) 
# Tensorflow returns a numpy array 
output = sess.run(final, feed_dict={Input: input}) 
# Now how do I get the data from output into data.pressure? 

편집 : 참고로, 이는하는 ctypes 모양 (파이썬 측)

class TransferData(ctypes.Structure): 
    _fields_ = [ 
     ('statusReady', ctypes.c_bool), 
     # ... 
     ('velocity', ctypes.c_double * (31 * 31 * 31)), 
     ('pressure', ctypes.c_double * (31 * 31 * 31)) 
    ] 
+0

'데이터'정의를 표시 할 수 있습니까? –

+0

확실한 것은 게시에 추가되었습니다. –

답변

1

이것은하는 ctypes하는 NumPy와 어레이로부터 전체 데이터 블록을 복사하는 방법을 어떻게 배열 :

012,
import numpy as np 
import ctypes 


# Preparing example 

class TransferData(ctypes.Structure): 
    _fields_ = [ 
     ('statusReady', ctypes.c_bool), 
     ('velocity', ctypes.c_double * 4), 
     ('pressure', ctypes.c_double * 4) 
    ] 


data = TransferData() 
output = np.array([12., 13., 11., 10.]) 


# Actual code 

# Both values should be equal but there could be problems with alignment settings 
assert ctypes.sizeof(data.pressure) == output.nbytes 

ctypes.memmove(ctypes.byref(data.pressure), output.ctypes.data, output.nbytes) 


print(list(data.pressure)) 
+0

감사합니다. 완벽하게 작동하며 현재 사용중인 경우 15 ~ 30 배 빠릅니다. –

관련 문제