将文件句柄传递给 cython 函数

2023-12-12

我想用 cython 编译一个 python 函数,用于读取跳过一些记录的二进制文件(不读取整个文件然后切片,因为我会耗尽内存)。我可以想出这样的东西:

    def FromFileSkip(fid, count=1, skip=0):            
        if skip>=0:
            data = numpy.zeros(count)
            k = 0
            while k<count:
                try:
                    data[k] = numpy.fromfile(fid, count=1, dtype=dtype)
                    fid.seek(skip, 1)
                    k +=1
                except ValueError:
                    data = data[:k]
                    break
            return data

然后我可以像这样使用该函数:

 f = open(filename)
 data = FromFileSkip(f,...

但是,为了使用 cython 编译函数“FromFileSkip”,我想定义函数中涉及的所有类型,因此还有“fid”文件处理程序。我如何在 cython 中定义它的类型,因为它不是“标准”类型,例如一个整数。 谢谢。


定义类型fid不会有帮助,因为调用 python 函数仍然很昂贵。尝试使用“-a”标志编译您的示例,看看我的意思。但是,您可以使用低级 C 函数进行文件处理,以避免循环中的 Python 开销。为了举例,我假设数据从文件的开头开始,并且其类型是double

from libc.stdio cimport *                                                                

cdef extern from "stdio.h":
    FILE *fdopen(int, const char *)

import numpy as np
cimport numpy as np

DTYPE = np.double # or whatever your type is
ctypedef np.double_t DTYPE_t # or whatever your type is

def FromFileSkip(fid, int count=1, int skip=0):
    cdef int k
    cdef FILE* cfile
    cdef np.ndarray[DTYPE_t, ndim=1] data
    cdef DTYPE_t* data_ptr

    cfile = fdopen(fid.fileno(), 'rb') # attach the stream
    data = np.zeros(count).astype(DTYPE)
    data_ptr = <DTYPE_t*>data.data

    # maybe skip some header bytes here
    # ...

    for k in range(count):
        if fread(<void*>(data_ptr + k), sizeof(DTYPE_t), 1, cfile) < 0:
            break
        if fseek(cfile, skip, SEEK_CUR):
            break

    return data

请注意,输出cython -a example.pyx显示循环内没有 python 开销。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将文件句柄传递给 cython 函数 的相关文章

随机推荐

  • UIWindow 中的多个视图

    我有一个 基于导航的应用程序 它还需要始终在屏幕底部显示一个视图 添加 UINavigationController 的视图后 我将这个新视图添加到 UIWindow 中 In my delegate s applicationDidFin
  • 设置链接数据库 (MS Access) 路径而不访问链接数据库

    我的 Access 系统由两部分组成 一个包含表单 报告和宏的 前端 mdb 文件 以及一个包含数据的后端 mdb 文件 前端 MDB 文件的副本存储在每台计算机上 后端文件位于 server share backend mdb 前端MDB
  • 使用 Robospice 和 Android Studio 出现 Commons-Io 重复条目错误

    我已经研究以下问题几个小时了 但还没有想出解决我的问题的方法 我已经尝试了 Stack Overflow 上的以下修复 Android Studio 更新至 1 0 损坏 MultiDex and Gradle 插件 v0 13 1 后重复
  • 计算给定数字在排序集中的索引

    不确定这个问题应该在 Math Overflow 上还是在这里 所以首先在这里尝试 假设我们有一个包含 N 个 1 和 M 个 0 的数字 有 M N M N 个不同的这样的数字 可以在可数集合中排序 例如 包含 2 个 1 和 3 个 0
  • RootViewController动画过渡,初始方向错误

    所以我遵循了这个线程 RootViewController 切换过渡动画将 window rootViewController 从 A 转移到 B 再到 C 代码如下所示 UIView transitionWithView self win
  • 斯坦福计算器应用程序不断崩溃

    我正在斯坦福大学使用 Swift 在线学习斯坦福大学 iPad 和 iPhone 开发人员课程 并致力于创建一个计算器应用程序 对于编程还是有点陌生 但是 每当我从计算器中选择运算符时 它就会不断崩溃并显示错误消息 operandStack
  • IE 的 css 'pointer-events' 属性替代方案

    我有一个下拉导航菜单 其中某些标题在单击时不应导航到其他页面 这些标题在单击时打开下拉菜单 而其他标题则应导航 这些标题没有下拉菜单并直接导航 但是 两者类型有href给他们定义的 为了解决这个问题 我为前一种类型的标题添加了以下 css
  • Vue:不同页面之间共享数据

    var app new Vue el app data sharedData methods goToPageB function if some condition is met window location href pageB ht
  • 在 Laravel 中编码,在 Python 中解码

    我正在使用 Laravel 的加密字符串加密我网站上的一些数据的方法 它使用 OpenSSL 的 256 位 AES CBC 加密 无需任何序列化 我现在正尝试在 Python 中解密该数据 但我不断收到有关密钥长度的错误 并且似乎无法弄清
  • 仅当浏览器高度比页面短时,如何使用jquery显示“返回顶部”按钮?

    如何在底部添加 显示 返回顶部 按钮div使用jqueryonly ifheight 浏览器高度比页面高度短 否则应该隐藏 p a href mainwrapper Back to top a p to this div p Paragra
  • 在 php 中使用 PDO 类获取 num_rows 时出现问题

    我刚刚更改了数据库连接 我还不习惯 PDO 类或 OOP 无论如何 我像这样连接到数据库 dsn mysql host DB HOST dbname DB NAME try this gt db new PDO dsn DB USER DB
  • 正则表达式从多语言字符串中过滤除白名单之外的所有字符

    我正在尝试清理来自多语言网站上的搜索框的字符串 通常我会使用正则表达式 例如 allowed w s txt search preg replace allowed allowed iu 1 GET txt search 这对于英文文本来说
  • 如何以编程方式停止当前网站? [复制]

    这个问题在这里已经有答案了 我正在将 MVC 5 用于 Web 应用程序 Web 应用程序在 IIS 7 或更高版本中运行 在 Global asax 上application start 将设置许可证数量 protected void A
  • 中断accept()

    是否有操作系统可移植的方法来中断阻塞accept 我有一个多线程守护程序 服务 当守护程序 服务收到关闭信号时 需要优雅地关闭所有侦听网络主机 我看到有人说你应该使用非阻塞套接字或选择超时 但这些不会降低性能 因为我的应用程序应该尽可能快
  • Android - 使用 parse 和 pubnub 在随机聊天应用程序中正确配对和连接两个用户

    我目前正在创建一个随机聊天应用程序 用户按下按钮并与另一个用户配对 然后他们就可以聊天 我计划使用 Parse 进行用户控制和文件存储 使用 pubnub 进行聊天 我的问题是 配对和连接两个用户并将他们放在一起聊天的正确方法是什么 假设
  • 根据部分 id 列表过滤 HtmlElements 列表

    我有一个 HtmlElementCollection 我想使用 Linq 获取其 id 包含另一个列表中的 id 的 HtmlElements 列表 所以我尝试了一些方法 但都没有成功 我从集合中获取一个列表并尝试对其进行过滤 这是部分 i
  • 在 Jenkins 管道 shell 中运行嵌套命令

    我想在 Jenkins 管道中运行嵌套 shell 命令 例如如下所示 docker stop docker ps aq 不幸的是 当我将其格式化为管道语法时 sh docker stop docker ps aq 詹金斯似乎没有正确运行它
  • 为什么调度会针对特定 URL 抛出“java.net.ConnectException: General SSLEngine ...”和“意外状态”异常?

    我有以下非工作代码 object Main extends App import dispatch def test address String Await result Http default url address GET OK a
  • 函数式编程和非函数式编程[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 在大学第二年 我们 教 了 Haskell 我对此几乎一无所知 对函数式编程更是一无所知 什么是函数式编程 为什么和 或我想在哪里使用它而不是非函数式编程 我认为 C 是一种非函
  • 将文件句柄传递给 cython 函数

    我想用 cython 编译一个 python 函数 用于读取跳过一些记录的二进制文件 不读取整个文件然后切片 因为我会耗尽内存 我可以想出这样的东西 def FromFileSkip fid count 1 skip 0 if skip g