首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将外部内存解释为lisp内存(反之亦然),而不复制数据

将外部内存解释为lisp内存(反之亦然),而不复制数据
EN

Stack Overflow用户
提问于 2018-11-19 20:12:41
回答 1查看 433关注 0票数 7

我试着用数据库API C-函数(例如,db-write-chunk)将BLOB逐块写入数据库。此函数以指向外部内存的指针(在其中放置块)作为参数。所以,我为一个块做了一个缓冲区:foreign-buffer。我将通过read-sequence从文件(或二进制流)获取块数据到stream-buffer

代码语言:javascript
复制
(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-buffer

BLOB中的L是大的,循环可能会重复多次。除此之外,所有这些代码都可以由外部循环(例如bulk-insert)包装。因此,我希望最小化循环主体中的步骤数。

要做到这一点我需要:

  • 要能够读取序列而不是流缓冲区,而是直接读取外部缓冲区,如下所示: (读取序列(强制外部缓冲区‘(向量/数组.))我的小溪)
  • 或者能够将流缓冲区解释为外部内存,如: (数据库-写块(mem流-缓冲区:uchar 0))

是否有可能只使用单个缓冲区--本地缓冲区或外存--解决我的问题,而无需在它们之间复制内存?

EN

回答 1

Stack Overflow用户

发布于 2019-05-14 20:50:17

和其他的ffi一样,这是依赖于实现的,但是cffi有cffi:make-shareable-byte-vector,它是一个CL (unsigned-byte 8)数组,然后可以与cffi:with-pointer-to-vector-data一起使用。

代码语言:javascript
复制
(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期间固定矢量数据来工作的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53381958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档