~ubuntu-branches/ubuntu/feisty/python-numpy/feisty

« back to all changes in this revision

Viewing changes to numpy/core/memmap.py

  • Committer: Bazaar Package Importer
  • Author(s): Matthias Klose
  • Date: 2006-07-12 10:00:24 UTC
  • Revision ID: james.westby@ubuntu.com-20060712100024-5lw9q2yczlisqcrt
Tags: upstream-0.9.8
ImportĀ upstreamĀ versionĀ 0.9.8

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
__all__ = ['memmap']
 
2
 
 
3
import mmap
 
4
from numeric import uint8, ndarray, dtype
 
5
from numerictypes import nbytes
 
6
 
 
7
dtypedescr = dtype
 
8
valid_filemodes = ["r", "c", "r+", "w+"]
 
9
writeable_filemodes = ["r+","w+"]
 
10
 
 
11
mode_equivalents = {
 
12
    "readonly":"r",
 
13
    "copyonwrite":"c",
 
14
    "readwrite":"r+",
 
15
    "write":"w+"
 
16
    }
 
17
 
 
18
class memmap(ndarray):
 
19
    __array_priority__ = -100.0
 
20
    def __new__(subtype, name, dtype=uint8, mode='r+', offset=0,
 
21
                shape=None, order=0):
 
22
        try:
 
23
            mode = mode_equivalents[mode]
 
24
        except KeyError:
 
25
            if mode not in valid_filemodes:
 
26
                raise ValueError("mode must be one of %s" % \
 
27
                                 (valid_filemodes + mode_equivalents.keys()))
 
28
 
 
29
        fid = file(name, (mode == 'c' and 'r' or mode)+'b')
 
30
 
 
31
        if (mode == 'w+') and shape is None:
 
32
            raise ValueError, "shape must be given"
 
33
 
 
34
        fid.seek(0,2)
 
35
        flen = fid.tell()
 
36
        descr = dtypedescr(dtype)
 
37
        _dbytes = descr.itemsize
 
38
 
 
39
        if shape is None:
 
40
            bytes = flen-offset
 
41
            if (bytes % _dbytes):
 
42
                fid.close()
 
43
                raise ValueError, "Size of available data is not a "\
 
44
                      "multiple of data-type size."
 
45
            size = bytes // _dbytes
 
46
            shape = (size,)
 
47
        else:
 
48
            if not isinstance(shape, tuple):
 
49
                shape = (shape,)
 
50
            size = 1
 
51
            for k in shape:
 
52
                size *= k
 
53
 
 
54
        bytes = offset + size*_dbytes
 
55
 
 
56
        if mode == 'w+' or (mode == 'r+' and flen < bytes):
 
57
            fid.seek(bytes-1,0)
 
58
            fid.write(chr(0))
 
59
            fid.flush()
 
60
 
 
61
        if mode == 'c':
 
62
            acc = mmap.ACCESS_COPY
 
63
        elif mode == 'r':
 
64
            acc = mmap.ACCESS_READ
 
65
        else:
 
66
            acc = mmap.ACCESS_WRITE
 
67
 
 
68
        mm = mmap.mmap(fid.fileno(), bytes, access=acc)
 
69
 
 
70
        self = ndarray.__new__(subtype, shape, dtype=descr, buffer=mm,
 
71
                               offset=offset, order=order)
 
72
        self._mmap = mm
 
73
        self._offset = offset
 
74
        self._mode = mode
 
75
        self._size = size
 
76
        self._name = name
 
77
        fid.close()
 
78
        return self
 
79
 
 
80
    def __array_finalize__(self, obj):
 
81
        if obj is not None and not isinstance(obj, memmap):
 
82
            raise ValueError, "Cannot create a memmap array that way"
 
83
        self._mmap = None
 
84
 
 
85
    def sync(self):
 
86
        self._mmap.flush()
 
87
 
 
88
    def __del__(self):
 
89
        if self._mmap is not None:
 
90
            self._mmap.flush()
 
91
            del self._mmap