我有一个较大的二进制数据文件,我想将它加载到C数组中以便快速访问。数据文件只包含4个字节的整数。Cython将二进制字符串快速转换为int数组
我通过pkgutil.get_data函数获取数据,该函数返回一个二进制字符串。 下面的代码工作:
import pkgutil
import struct
cdef int data[32487834]
def load_data():
global data
py_data = pkgutil.get_data('my_module', 'my_data')
for i in range(32487834):
data[i] = <int>struct.unpack('i', py_data[4*i:4*(i+1)])[0]
return 0
load_data()
的问题是,这个代码是相当缓慢。读取整个数据文件可能需要7或8秒。将文件直接读入C中的数组只需要1-2秒,但我想使用pkgutil.get_data,这样我的模块就可以可靠地找到安装它的数据。
所以,我的问题是:什么是最好的方法来做到这一点?有没有一种方法可以直接将数据转换为int数组而无需对struct.unpack进行所有调用?而作为第二个问题,是否有办法简单地获取指向数据的指针,以避免不必要地复制120MB数据?
另外,有一种方法,使pkgutil返回数据,而不是数据本身的文件路径(在这种情况下,我可以使用C文件IO相当迅速读取文件
编辑:
只是为了记录在案,这里是最后使用的代码(基于Veedrac的答案):
import pkgutil
from cpython cimport array
import array
cdef int[:] data
cdef void load_data():
global data
py_data = pkgutil.get_data('my_module', 'my_data')
data = array.array('i', py_data)
load_data()
一切是相当快的
为什么不只是记忆地图呢? – 2014-11-06 16:53:42