2010-09-03 28 views
8

Tôi tự hỏi nếu nó có thể cho các gói ctypes để giao tiếp với mmap.Python, ctypes và mmap

Hiện tại, mô-đun của tôi phân bổ bộ đệm (với create_string_buffer) và sau đó chuyển nó bằng cách sử dụng byref vào thư viện của tôi mylib.read chức năng. Điều này, như tên cho thấy, đọc dữ liệu vào bộ đệm. Sau đó tôi gọi file.write(buf.raw) để ghi dữ liệu vào đĩa. Tuy nhiên, các tiêu chuẩn của tôi cho thấy điều này ở xa tối ưu (thời gian dành cho file.write là thời gian tốt hơn chi tiêu trong mylib.read).

Do đó, tôi muốn biết liệu ctypes có thể tương thích với mmap không. Cho một ví dụ mmap.mmap và một bù đắp làm thế nào tôi có thể nhận được một con trỏ (c_void_p) vào không gian địa chỉ?

+0

Python có mô-đun [mmap] (http://docs.python.org/library/mmap.html). – Seth

+1

@Ví dụ 'mmap.mmap' mà tôi đang đề cập đến là từ mô-đun đó. Tôi muốn biết làm thế nào các trường hợp của nó có thể giao tiếp với ctypes. –

+0

Bạn có chắc là bạn nên làm điều này bằng Python? Con trỏ mức độ thấp tung hứng là phù hợp hơn với C hoặc ilk của nó. Nó không quá khó để viết các mô-đun C để giao diện độc đáo với Python. – katrielalex

Trả lời

10

Một đối tượng mmap "hỗ trợ giao diện đệm ghi", do đó bạn có thể sử dụng phương pháp from_buffer lớp, mà tất cả ctypes lớp có, với mmap dụ như là đối số, để tạo ra một đối tượng ctypes giống như bạn muốn, ví dụ, chia sẻ bộ nhớ (và do đó tập tin cơ bản) mà cá thể mmap đã được ánh xạ. Tôi tưởng tượng, cụ thể là bạn sẽ muốn có một số ctypesarray phù hợp.

+0

Một ví dụ tuyệt vời về điều này: https://github.com/serdardalgic/Code_Snippets/blob/master/Python-Examples/mmap/shared_memory_write.py –

1

Xin lưu ý rằng hệ điều hành sẽ vẫn đang thực hiện readahead cho read(). Bạn sẽ bị chặn ở dạng read() hoặc write() - cái kia sẽ tắc nghẽn hoạt động - nhưng ngay cả khi bạn đang chặn trong một, điều đó không có nghĩa là cái kia không xảy ra cho bạn đằng sau hậu trường. Đó là công việc của mọi hệ điều hành đa nhiệm.

Nếu bạn sử dụng mmap cho điều này, bạn rất có thể làm mọi thứ phức tạp hơn cho hệ điều hành - khiến việc xác định bạn thực sự chỉ truyền dữ liệu vào và ra trở nên phức tạp hơn nó làm đọc trước. Nó vẫn có thể con số nó ra (hệ điều hành là rất tốt lúc này), nhưng có lẽ bạn không giúp đỡ.

Lợi ích duy nhất về nguyên tắc là tránh chi phí của bản sao bộ nhớ, nhưng nó không giống như mục tiêu của bạn ở đây (và trừ khi hồ sơ rõ ràng nói khác đi, tôi chắc chắn sẽ giúp hiệu suất).

+1

mylibrary.read() giao diện với thiết bị 1394 được kết nối, tại thời điểm đó, hệ thống I/O bus hoàn toàn không hoạt động. Trước khi yêu cầu tôi đã hack cùng một vòng lặp trong nguyên C và điểm chuẩn mmap đối với read()/write(). mmap nhanh hơn ~ 50%. –