假设我们正在使用Python并调用一些用C ++编写的DLL库。我们在Python中打开了一个非常大的数据集,然后我们想调用一个用C ++编写的库,并将具有打开的数据的数组作为参数添加。库将对该数组执行某些操作,然后将其返回到Python代码。
那么问题是:是否可以使用相同的内存位置?因为在这种情况下,我们不需要复制大量数据两次。
那么问题是:是否可以使用相同的内存位置?因为在这种情况下,我们不需要复制大量数据两次。
numpy.ndarray.ctypes.data
),并通过ctypes将其传递给C++代码。您可以在这里看到一个很好的例子。图像数据在这方面也类似(PIL图像采用简单的内存格式,可以轻松获得其数据的指针)。python.h
并处理非平凡的Python API。这是使用内存映射文件实现的。我不会以任何方式声称高速或高效。这只是为了展示其工作原理的示例。
$ python --version
Python 3.7.9
$ g++ --version
g++ (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
#include <sys/mman.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
// assume file exists
int fd = -1;
if ((fd = open("pods.txt", O_RDWR, 0)) == -1)
{
printf("unable to open pods.txt\n");
return 0;
}
// open the file in shared memory
char* shared = (char*) mmap(NULL, 8, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
// periodically read the file contents
while (true)
{
printf("0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", shared[0], shared[1], shared[2], shared[3], shared[4], shared[5], shared[6], shared[7]);
sleep(1);
}
return 0;
}
Python方面:
import mmap
import os
import time
fname = './pods.txt'
if not os.path.isfile(fname):
# create initial file
with open(fname, "w+b") as fd:
fd.write(b'\x01\x00\x00\x00\x00\x00\x00\x00')
# at this point, file exists, so memory map it
with open(fname, "r+b") as fd:
mm = mmap.mmap(fd.fileno(), 8, access=mmap.ACCESS_WRITE, offset=0)
# set one of the pods to true (== 0x01) all the rest to false
posn = 0
while True:
print(f'writing posn:{posn}')
# reset to the start of the file
mm.seek(0)
# write the true/false values, only one is true
for count in range(8):
curr = b'\x01' if count == posn else b'\x00'
mm.write(curr)
# admire the view
time.sleep(2)
# set up for the next position in the next loop
posn = (posn + 1) % 8
mm.close()
fd.close()
要运行它,在终端1中执行:
a.out # or whatever you called the C++ executable
0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x01 0x00 0x00 0x00
0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x01 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x00
例如,由于C++代码中的sleep(2),您应该看到0x01每隔几秒钟移动一步。
在第二个终端中:
python my.py # or whatever you called the python file
writing posn:0
writing posn:1
writing posn:2