2017-11-23 2 views
2

私は、光ダイオードからのデータを連続的に読み込み、現在の時間とともにメモリマップファイルに書き込むC言語のモジュールをC言語に持っています。ユーザー空間のCプログラムから、私はカーネルからデータにアクセスできます。私はPythonでmmap機能を使って同じことを試みました。しかし、ファイルをmmapしようとすると、 "mmap length is file size"や "mmap file is empty"のようなエラーが出ます。 PythonはCからのmmapedファイルにアクセスできないと思われますが、それは正しいですか?最終的には、さらなる処理のためにフォトダイオードデータの数の少ない配列が必要です。共有カーネルメモリにアクセスするためのPython mmap

カーネルのデータ構造の詳細: mmapには、最新の電圧値に対するインデックスを持つ構造体と電圧と時間の構造体配列が含まれています。カーネルは1つの大きな構造体配列を持ち、ページサイズのチャンクにあるフォトダイオードデータを構造体配列に書き込みます。 Cのユーザ空間プログラムは、さらに処理するために各チャンクを読み込みます。 mmaped Cファイル読み込みする

Pythonコード:

num_pages = 103 
page_size = 10000 
max_buffer_size = num_pages * page_size 

class buf_element(ctypes.Structure): 

    _fields_ = [("voltage", ctypes.c_int), 
     ("time", ctypes.c_uint)] 

class data(ctypes.Structure): 

    _fields_ = [("latest_page_offset", ctypes.c_int), 
       ("buffer", ctypes.POINTER(buf_element))] 

length_data = ctypes.sizeof(ctypes.c_int) + max_buffer_size * ctypes.sizeof(buf_element); 
fd = os.open(data_file, os.O_RDWR) 
buf = mmap.mmap(fd, length_data, mmap.MAP_SHARED, mmap.PROT_READ) 
test_data = data.from_buffer(buf) 
print test_data.latest_page_offset 
os.close(fd) 

私の考えは、Cの拡張機能を経由してのpythonから、既存および作業Cのコードを使用することでした。だから、pythonはCを呼び出し、数値の配列を渡し、Cはそれにデータを書き込みます。それは最速の方法ですか?その他のおすすめ?

答えて

0

私はPythonのCython経由でCコードを使用しています。

関連する問題