Append multiple rows to an SFrame.

        Throws a RuntimeError if one or more column's type is incompatible with
        a type appended.

        Parameters
        ----------
        data  : iterable[iterable]
            A collection of multiple iterables, each representing a single row.

        segment : int
            The segment to write the given rows. Each segment is numbered
            sequentially, starting with 0. Any value in segment 1 will be after
            any value in segment 0, and the order of rows in each segment is
            preserved as they are added.

def append_multiple(self, data, segment=0):
        """
        Append multiple rows to an SFrame.

        Throws a RuntimeError if one or more column's type is incompatible with
        a type appended.

        Parameters
        ----------
        data  : iterable[iterable]
            A collection of multiple iterables, each representing a single row.

        segment : int
            The segment to write the given rows. Each segment is numbered
            sequentially, starting with 0. Any value in segment 1 will be after
            any value in segment 0, and the order of rows in each segment is
            preserved as they are added.
        """
        if not hasattr(data, '__iter__'):
            raise TypeError("append_multiple must be passed an iterable object")
        tmp_list = []

        # Avoid copy in cases that we are passed materialized data that is
        # smaller than our block size
        if hasattr(data, '__len__'):
            if len(data) <= self._block_size:
                self._builder.append_multiple(data, segment)
                return

        for i in data:
            tmp_list.append(i)
            if len(tmp_list) >= self._block_size:
                self._builder.append_multiple(tmp_list, segment)
                tmp_list = []
        if len(tmp_list) > 0:
            self._builder.append_multiple(tmp_list, segment)