summaryrefslogtreecommitdiff
path: root/numpy/core/memmap.py
diff options
context:
space:
mode:
authorTravis Oliphant <oliphant@enthought.com>2006-01-04 17:33:12 +0000
committerTravis Oliphant <oliphant@enthought.com>2006-01-04 17:33:12 +0000
commit8057b2d910a5a6726a666a2c18ac495dbb9e6000 (patch)
treee8ab5a397e9d2d1fd3885f3524821587ee2d407c /numpy/core/memmap.py
parentda9c6da4a304d240492b653f526b9607b032921c (diff)
downloadnumpy-8057b2d910a5a6726a666a2c18ac495dbb9e6000.tar.gz
rename sub-packages
Diffstat (limited to 'numpy/core/memmap.py')
-rw-r--r--numpy/core/memmap.py88
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
+
+