我试着用数据库API C-函数(例如,db-write-chunk)将BLOB逐块写入数据库。此函数以指向外部内存的指针(在其中放置块)作为参数。所以,我为一个块做了一个缓冲区:foreign-buffer。我将通过read-sequence从文件(或二进制流)获取块数据到stream-buffer中
(let ((foreign-buffer (foreign-alloc :uchar 1024)))
(stream-buffer ((make-array 1024 :element-type '(unsigned-byte 8))))
(loop
for cnt = (read-sequence stream-buffer MY-STREAM)
while (> cnt 0)
do
;; copy cnt bytes from stream-buffer into foreign-buffer
;; call db-write-chunk with foreign-bufferBLOB中的L是大的,循环可能会重复多次。除此之外,所有这些代码都可以由外部循环(例如bulk-insert)包装。因此,我希望最小化循环主体中的步骤数。
要做到这一点我需要:
是否有可能只使用单个缓冲区--本地缓冲区或外存--解决我的问题,而无需在它们之间复制内存?
发布于 2019-05-14 20:50:17
和其他的ffi一样,这是依赖于实现的,但是cffi有cffi:make-shareable-byte-vector,它是一个CL (unsigned-byte 8)数组,然后可以与cffi:with-pointer-to-vector-data一起使用。
(cffi:defcfun memset :pointer
(ptr :pointer)
(val :int)
(size :int))
(let ((vec (cffi:make-shareable-byte-vector 256)))
(cffi:with-pointer-to-vector-data (ptr vec)
(memset ptr 0 (length vec))))根据您的使用情况,这可能比static-vectors更好,因为您不必记住手动释放它。在SBCL上,这是通过在with-pointer-to-vector-data期间固定矢量数据来工作的。
https://stackoverflow.com/questions/53381958
复制相似问题