示例#1
0
def write_python_data(parent, name, mime, data):
    tables = get_tables()
    from tables.flavor import flavor_of

    hf = parent._v_file
    group = hf.createGroup(parent, name)
    hf.createArray(group, "mime", mime)
    try:
        flavor_of(data)
        ok_pytables = True
    except:
        ok_pytables = False

    # 2014-01-02 XXX this is a hack
    if data == []:
        ok_pytables = False

    if ok_pytables:
        try:
            hf.createArray(group, "value", data)
        except:
            msg = "Error while writing python data"
            msg += "\n parent: %s" % parent
            msg += "\n name: %s" % name
            msg += "\n mime: %s" % mime
            msg += "\n data: %s" % describe_type(data)
            msg += "\n       %s" % describe_value(data)
            msg += "\n flavor: %s" % flavor_of(data)
            msg += "\nraw:\n%s" % data.__repr__()
            logger.error(msg)
            raise
        serialized = "pytables"
    else:
        serialized = "pickle"
        s = StringIO()
        cPickle.dump(data, s, protocol=2)
        hf.createVLArray(group, "pickle", tables.VLStringAtom(), filters=None)
        group.pickle.append(s.getvalue())
    group._v_attrs["reprep_data_format"] = serialized
示例#2
0
def write_python_data(parent, name, mime, data):
    tables = get_tables()
    from tables.flavor import flavor_of
    hf = parent._v_file
    group = hf.createGroup(parent, name)
    hf.createArray(group, 'mime', mime)
    try:
        flavor_of(data)
        ok_pytables = True
    except:
        ok_pytables = False
    
    # 2014-01-02 XXX this is a hack
    if data == []:
        ok_pytables = False
        
    if ok_pytables: 
        try:
            hf.createArray(group, 'value', data)
        except:
            msg = 'Error while writing python data'
            msg += '\n parent: %s' % parent
            msg += '\n name: %s' % name
            msg += '\n mime: %s' % mime
            msg += '\n data: %s' % describe_type(data)
            msg += '\n       %s' % describe_value(data)
            msg += '\n flavor: %s' % flavor_of(data)
            msg += '\nraw:\n%s' % data.__repr__()
            logger.error(msg)
            raise
        serialized = 'pytables'
    else:
        serialized = 'pickle'
        s = StringIO()
        cPickle.dump(data, s, protocol=2)
        hf.createVLArray(group, 'pickle', tables.VLStringAtom(), filters=None)
        group.pickle.append(s.getvalue())    
    group._v_attrs['reprep_data_format'] = serialized
示例#3
0
    def _g_create(self):
        """Save a new array in file."""

        self._v_version = obversion
        try:
            # `Leaf._g_postInitHook()` should be setting the flavor on disk.
            self._flavor = flavor = flavor_of(self._object)
            nparr = array_as_internal(self._object, flavor)
        except:  #XXX
            # Problems converting data. Close the node and re-raise exception.
            self.close(flush=0)
            raise

        # Raise an error in case of unsupported object
        if nparr.dtype.kind in ['V', 'U', 'O']:  # in void, unicode, object
            raise TypeError, \
"Array objects cannot currently deal with void, unicode or object arrays"

        # Decrease the number of references to the object
        self._object = None

        # The shape of this array
        self.shape = tuple(SizeType(s) for s in nparr.shape)

        # Fix the byteorder of data
        nparr = self._g_fix_byteorder_data(nparr, nparr.dtype.byteorder)

        # Create the array on-disk
        try:
            # ``self._v_objectID`` needs to be set because would be
            # needed for setting attributes in some descendants later
            # on
            (self._v_objectID, self.atom) = self._createArray(
                nparr, self._v_new_title)
        except:  #XXX
            # Problems creating the Array on disk. Close node and re-raise.
            self.close(flush=0)
            raise

        # Compute the optimal buffer size
        chunkshape = self._calc_chunkshape(
            self.nrows, self.rowsize, self.atom.itemsize)
        self.nrowsinbuf = self._calc_nrowsinbuf(
            chunkshape, self.rowsize, self.atom.itemsize)
        # Arrays don't have chunkshapes (so, set it to None)
        self._v_chunkshape = None

        return self._v_objectID
    def _g_create(self):
        """Save a new array in file."""

        self._v_version = obversion
        try:
            # `Leaf._g_postInitHook()` should be setting the flavor on disk.
            self._flavor = flavor = flavor_of(self._object)
            nparr = array_as_internal(self._object, flavor)
        except:  #XXX
            # Problems converting data. Close the node and re-raise exception.
            self.close(flush=0)
            raise

        # Raise an error in case of unsupported object
        if nparr.dtype.kind in ['V', 'U', 'O']:  # in void, unicode, object
            raise TypeError, \
"Array objects cannot currently deal with void, unicode or object arrays"

        # Decrease the number of references to the object
        self._object = None

        # The shape of this array
        self.shape = tuple(SizeType(s) for s in nparr.shape)

        # Fix the byteorder of data
        nparr = self._g_fix_byteorder_data(nparr, nparr.dtype.byteorder)

        # Create the array on-disk
        try:
            # ``self._v_objectID`` needs to be set because would be
            # needed for setting attributes in some descendants later
            # on
            (self._v_objectID,
             self.atom) = self._createArray(nparr, self._v_new_title)
        except:  #XXX
            # Problems creating the Array on disk. Close node and re-raise.
            self.close(flush=0)
            raise

        # Compute the optimal buffer size
        chunkshape = self._calc_chunkshape(self.nrows, self.rowsize,
                                           self.atom.itemsize)
        self.nrowsinbuf = self._calc_nrowsinbuf(chunkshape, self.rowsize,
                                                self.atom.itemsize)
        # Arrays don't have chunkshapes (so, set it to None)
        self._v_chunkshape = None

        return self._v_objectID
示例#5
0
def create_earray(fileobj,
                  where,
                  name,
                  atom=None,
                  shape=None,
                  title="",
                  filters=None,
                  expectedrows=1000,
                  chunkshape=None,
                  byteorder=None,
                  createparents=False,
                  obj=None):
    """Create a new enlargeable array.

    Parameters
    ----------
    fileobj: File instance
        file in which creating the table
    where : str or Group
        The parent group from which the new array will hang. It can be a
        path string (for example '/level1/leaf5'), or a Group instance
        (see :ref:`GroupClassDescr`).
    name : str
        The name of the new array
    atom : Atom
        An Atom (see :ref:`AtomClassDescr`) instance representing the
        *type* and *shape* of the atomic objects to be saved.

        .. versionchanged:: 3.0
            The *atom* parameter can be None (default) if *obj* is
            provided.

    shape : tuple
        The shape of the new array.  One (and only one) of the shape
        dimensions *must* be 0.  The dimension being 0 means that the
        resulting EArray object can be extended along it.  Multiple
        enlargeable dimensions are not supported right now.

        .. versionchanged:: 3.0
            The *shape* parameter can be None (default) if *obj* is
            provided.

    title : str, optional
        A description for this node (it sets the TITLE HDF5 attribute on
        disk).
    expectedrows : int, optional
        A user estimate about the number of row elements that will be added
        to the growable dimension in the EArray node.  If not provided, the
        default value is EXPECTED_ROWS_EARRAY (see tables/parameters.py).
        If you plan to create either a much smaller or a much bigger array
        try providing a guess; this will optimize the HDF5 B-Tree creation
        and management process time and the amount of memory used.
    chunkshape : tuple, numeric, or None, optional
        The shape of the data chunk to be read or written in a single HDF5
        I/O operation.  Filters are applied to those chunks of data.  The
        dimensionality of chunkshape must be the same as that of shape
        (beware: no dimension should be 0 this time!).  If None, a sensible
        value is calculated based on the expectedrows parameter (which is
        recommended).
    byteorder : str, optional
        The byteorder of the data *on disk*, specified as 'little' or
        'big'. If this is not specified, the byteorder is that of the
        platform.
    createparents : bool, optional
        Whether to create the needed groups for the parent path to exist
        (not done by default).
    obj : python object
        The array or scalar to be saved.  Accepted types are NumPy
        arrays and scalars, as well as native Python sequences and
        scalars, provided that values are regular (i.e. they are
        not like ``[[1,2],2]``) and homogeneous (i.e. all the
        elements are of the same type).

        The *obj* parameter is optional and it can be provided in
        alternative to the *atom* and *shape* parameters.
        If both *obj* and *atom* and/or *shape* are provided they must
        be consistent with each other.

        .. versionadded:: 3.0

    See Also
    --------
    EArray : for more information on enlargeable arrays

    """
    if obj is not None:
        flavor = flavor_of(obj)
        obj = array_as_internal(obj, flavor)

        earray_shape = (0, ) + obj.shape[1:]

        if shape is not None and shape != earray_shape:
            raise TypeError('the shape parameter is not compatible '
                            'with obj.shape.')
        else:
            shape = earray_shape

        if atom is not None and atom.dtype != obj.dtype:
            raise TypeError('the atom parameter is not consistent with '
                            'the data type of the obj parameter')
        elif atom is None:
            atom = Atom.from_dtype(obj.dtype)

    parentnode = fileobj._getOrCreatePath(where, createparents)
    _checkfilters(filters)
    ptobj = EArray(parentnode,
                   name,
                   atom=atom,
                   shape=shape,
                   title=title,
                   filters=filters,
                   expectedrows=expectedrows,
                   chunkshape=chunkshape,
                   byteorder=byteorder)

    if obj is not None:
        ptobj.append(obj)

    return ptobj