Đối với việc thực hiện di động, bạn có thể muốn sử dụng thư viện osicat
, cung cấp trình bao bọc CFFI cho nhiều cuộc gọi POSIX trong gói osicat-posix
.
Có một bài viết rất hay và ngắn với mã để sử dụng nó tại http://wandrian.net/2012-04-07-1352-mmap-files-in-lisp.html (bởi Nicolas Martyanoff).
Để gìn giữ đó, tôi chủ yếu là trích dẫn từ đó:
Lập bản đồ một tập tin được thực hiện bằng cách mở nó với osicat-posix:open
, đọc kích thước của nó với fstat
, sau đó gọi mmap
. Khi tệp đã được ánh xạ, chúng tôi có thể đóng bộ mô tả tệp, không cần thiết nữa.
(defun mmap-file (path)
(let ((fd (osicat-posix:open path (logior osicat-posix:o-rdonly))))
(unwind-protect
(let* ((size (osicat-posix:stat-size (osicat-posix:fstat fd)))
(addr (osicat-posix:mmap (cffi:null-pointer) size
(logior osicat-posix:prot-read)
(logior osicat-posix:map-private)
fd 0)))
(values addr size))
(osicat-posix:close fd))))
Chức năng mmap-file trả về hai giá trị: địa chỉ của ánh xạ bộ nhớ và kích thước của nó.
Việc hủy ánh xạ đoạn bộ nhớ này được thực hiện với osicat-posix:munmap
.
Hãy thêm một macro để ánh xạ một cách an toàn và các tập tin unmap:
(defmacro with-mmapped-file ((file addr size) &body body)
(let ((original-addr (gensym "ADDR-"))
(original-size (gensym "SIZE-")))
`(multiple-value-bind (,addr ,size)
(mmap-file ,file)
(let ((,original-addr ,addr)
(,original-size ,size))
(unwind-protect
(progn ,@body)
(osicat-posix:munmap ,original-addr ,original-size))))))
vĩ mô mmap
s file cho này và liên kết hai biến cho địa chỉ và và kích thước của nó. Sau đó, bạn có thể tính toán con trỏ địa chỉ với cffi:inc-pointer
và truy cập nội dung tệp với cffi:mem-aref
. Bạn có thể muốn xây dựng các trình bao bọc riêng của mình xung quanh điều này để thể hiện định dạng tệp của bạn (ví dụ: văn bản thuần trong UTF-8).
(So với việc niêm yết liên kết ở trên, tôi loại bỏ các gói của osicat-posix:munmap
vào một chức năng hoàn toàn giống chữ ký và có hiệu lực, vì nó có vẻ không cần thiết đối với tôi.)
Cảm ơn câu trả lời! Cả hai dường như giải quyết vấn đề của tôi vì vậy tôi sẽ thử chúng ra và chấp nhận một trong những tôi kết thúc bằng cách sử dụng. – owagh