diff options
| author | Victor Chahuneau <vchahune@cs.cmu.edu> | 2012-12-23 23:07:31 +0100 | 
|---|---|---|
| committer | Victor Chahuneau <vchahune@cs.cmu.edu> | 2012-12-23 23:07:31 +0100 | 
| commit | e66ce4f37f98af2e23c800c7dc6fd8fc83d07353 (patch) | |
| tree | 9972e8ed1adeb56ede19b2c6020e92a5116860e4 /python/src/sa/mmap.pxi | |
| parent | 597d89c11db53e91bc011eab70fd613bbe6453e8 (diff) | |
Memory mapping for IntList/FloatList
+ vocabulary class for DataArray & BiLex
Diffstat (limited to 'python/src/sa/mmap.pxi')
| -rw-r--r-- | python/src/sa/mmap.pxi | 53 | 
1 files changed, 53 insertions, 0 deletions
| diff --git a/python/src/sa/mmap.pxi b/python/src/sa/mmap.pxi new file mode 100644 index 00000000..6b65b779 --- /dev/null +++ b/python/src/sa/mmap.pxi @@ -0,0 +1,53 @@ +cimport posix.fcntl +cimport posix.unistd +from posix.unistd cimport off_t + +cdef extern from "sys/mman.h": +    void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset) +    int munmap(void *addr, size_t len) +    enum: +        PROT_READ +    enum: +        MAP_FILE +        MAP_SHARED + +cdef extern from "sys/stat.h": +    cdef struct stat: +        off_t st_size +    int fstat(int fildes, stat *buf) + +cdef class MemoryMap: +    def __init__(self, filename): +        self.fd = posix.fcntl.open(filename, posix.fcntl.O_RDONLY) +        assert self.fd >= 0 +        # Get file size +        cdef stat statbuf +        fstat(self.fd, &statbuf)  +        self.fs = statbuf.st_size +        # Memory map file +        self.map_start = mmap(NULL, self.fs, PROT_READ, MAP_FILE|MAP_SHARED, self.fd, 0) +        self.map_ptr = self.map_start + +    def __dealloc__(self): +        posix.unistd.close(self.fd) +        munmap(self.map_start, self.fs) + +    cdef int read_int(self): +        cdef int v = (<int*> self.map_ptr)[0] +        self.map_ptr = &(<int*> self.map_ptr)[1] +        return v + +    cdef int* read_int_array(self, int size): +        cdef int* v = <int*> self.map_ptr +        self.map_ptr = &(<int*> self.map_ptr)[size] +        return v + +    cdef char* read_char_array(self, int size): +        cdef char* v = <char*> self.map_ptr +        self.map_ptr = &(<char*> self.map_ptr)[size] +        return v + +    cdef float* read_float_array(self, int size): +        cdef float* v = <float*> self.map_ptr +        self.map_ptr = &(<float*> self.map_ptr)[size] +        return v | 
