diff options
author | Travis Oliphant <oliphant@enthought.com> | 2006-01-04 17:33:12 +0000 |
---|---|---|
committer | Travis Oliphant <oliphant@enthought.com> | 2006-01-04 17:33:12 +0000 |
commit | 8057b2d910a5a6726a666a2c18ac495dbb9e6000 (patch) | |
tree | e8ab5a397e9d2d1fd3885f3524821587ee2d407c /numpy/core/memmap.py | |
parent | da9c6da4a304d240492b653f526b9607b032921c (diff) | |
download | numpy-8057b2d910a5a6726a666a2c18ac495dbb9e6000.tar.gz |
rename sub-packages
Diffstat (limited to 'numpy/core/memmap.py')
-rw-r--r-- | numpy/core/memmap.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/numpy/core/memmap.py b/numpy/core/memmap.py new file mode 100644 index 000000000..8a791e5aa --- /dev/null +++ b/numpy/core/memmap.py @@ -0,0 +1,88 @@ +__all__ = ['memmap'] + +import mmap +from numeric import uint8, ndarray, dtypedescr +from numerictypes import nbytes + +valid_filemodes = ["r", "c", "r+", "w+"] +writeable_filemodes = ["r+","w+"] + +mode_equivalents = { + "readonly":"r", + "copyonwrite":"c", + "readwrite":"r+", + "write":"w+" + } + + +class memmap(ndarray): + def __new__(subtype, name, dtype=uint8, mode='r+', offset=0, + shape=None, fortran=0): + + try: + mode = mode_equivalents[mode] + except KeyError: + if mode not in valid_filemodes: + raise ValueError("mode must be one of %s" % \ + (valid_filemodes + mode_equivalents.keys())) + + fid = file(name, (mode == 'c' and 'r' or mode)+'b') + + if (mode == 'w+') and shape is None: + raise ValueError, "shape must be given" + + fid.seek(0,2) + flen = fid.tell() + descr = dtypedescr(dtype) + _dbytes = descr.itemsize + + if shape is None: + bytes = flen-offset + if (bytes % _dbytes): + fid.close() + raise ValueError, "Size of available data is not a "\ + "multiple of data-type size." + size = bytes // _dbytes + shape = (size,) + else: + if not isinstance(shape, tuple): + shape = (shape,) + size = 1 + for k in shape: + size *= k + + bytes = offset + size*_dbytes + + if mode == 'w+' or (mode == 'r+' and flen < bytes): + fid.seek(bytes-1,0) + fid.write(chr(0)) + fid.flush() + + if mode == 'c': + acc = mmap.ACCESS_COPY + elif mode == 'r': + acc = mmap.ACCESS_READ + else: + acc = mmap.ACCESS_WRITE + + mm = mmap.mmap(fid.fileno(), bytes, access=acc) + + self = ndarray.__new__(subtype, shape, dtype=descr, buffer=mm, + offset=offset, fortran=fortran) + self._mmap = mm + self._offset = offset + self._mode = mode + self._size = size + self._name = name + + fid.close() + return self + + def sync(self): + self._mmap.flush() + + def __del__(self): + self._mmap.flush() + del self._mmap + + |