Main Content

Arreglos altos para datos con memoria insuficiente

Los arreglos altos se usan para trabajar con datos con memoria insuficiente respaldados por un datastore. Los almacenes de datos le permiten trabajar con conjuntos de datos grandes en pequeños bloques que caben individualmente en la memoria, en lugar de cargar todo el conjunto de datos en la memoria a la vez. Los arreglos altos amplían esta capacidad para permitirle trabajar con datos con memoria insuficiente mediante funciones comunes.

¿Qué es un arreglo alto?

Como no se cargan todos los datos en la memoria a la vez, los arreglos altos pueden ser arbitrariamente grandes en la primera dimensión (es decir, pueden tener cualquier número de filas). En lugar de escribir código especial que tenga en cuenta el gran tamaño de los datos, como con técnicas como MapReduce, los arreglos altos le permiten trabajar con grandes conjuntos de datos de manera intuitiva y similar a la que utilizaría con arreglos de MATLAB® en memoria. Muchos operadores y funciones básicos trabajan igual con los arreglos altos que con los arreglos en memoria. MATLAB trabaja con pequeños bloques de datos a la vez, con toda la fragmentación y el procesamiento de los datos en segundo plano, para que las expresiones comunes, como A+B, funcionen con grandes conjuntos de datos.

Ventajas de los arreglos altos

A diferencia de lo que ocurre con los arreglos en memoria, los arreglos altos suelen permanecer sin evaluar hasta que se solicite que se realicen los cálculos con la función gather. Esta evaluación diferida le permite trabajar rápidamente con grandes conjuntos de datos. Cuando finalmente solicita la salida con gather, MATLAB combina los cálculos en cola cuando es posible y realiza el número mínimo de pasadas por los datos. El número de pasadas por los datos afecta en gran medida al tiempo de ejecución, por lo que se recomienda que solo solicite la salida cuando sea necesario.

Nota

Dado que gather devuelve resultados como arreglos de MATLAB en memoria, se aplican las consideraciones de memoria estándar. MATLAB podría quedarse sin memoria si el resultado devuelto por gather es demasiado grande.

Crear tablas altas

Las tablas altas son como las tablas de MATLAB en memoria, salvo que pueden contener cualquier número de filas. Para crear una tabla alta a partir de un conjunto de datos grande, primero tiene que crear un almacén de datos para los datos. Si el almacén de datos ds contiene datos tabulares, tall(ds) devuelve una tabla alta o un horario alto que contiene los datos. Consulte Función Datastore para obtener más información sobre la creación de almacenes de datos.

Cree un almacén de datos de hoja de cálculo que dirija a un archivo tabular de datos de vuelos de aerolíneas. En el caso de carpetas que contengan una recopilación de archivos, puede especificar la ubicación de toda la carpeta o utilizar el carácter comodín, '*.csv', para incluir varios archivos con la misma extensión de archivo en el almacén de datos. Limpie los datos tratando los valores 'NA' como datos ausentes para que tabularTextDatastore los reemplace con valores NaN. Asimismo, establezca el formato de unas cuantas variables de texto en %s para que tabularTextDatastore las lea como arreglos de celdas de vectores de caracteres.

ds = tabularTextDatastore('airlinesmall.csv');
ds.TreatAsMissing = 'NA';
ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'TailNum')} = '%s';
ds.SelectedFormats{strcmp(ds.SelectedVariableNames,'CancellationCode')} = '%s';

Cree una tabla alta desde el almacén de datos. Cuando realiza cálculos en esta tabla alta, el almacén de datos subyacente lee los bloques de datos y los pasa a la tabla alta para que los procese. Ni el almacén de datos ni la tabla alta conservan ninguno de los datos subyacentes.

tt = tall(ds)
tt =

  M×29 tall table 

    Year    Month    DayofMonth    DayOfWeek    DepTime    CRSDepTime    ArrTime    CRSArrTime    UniqueCarrier    FlightNum    TailNum    ActualElapsedTime    CRSElapsedTime    AirTime    ArrDelay    DepDelay    Origin    Dest     Distance    TaxiIn    TaxiOut    Cancelled    CancellationCode    Diverted    CarrierDelay    WeatherDelay    NASDelay    SecurityDelay    LateAircraftDelay
    ____    _____    __________    _________    _______    __________    _______    __________    _____________    _________    _______    _________________    ______________    _______    ________    ________    ______    _____    ________    ______    _______    _________    ________________    ________    ____________    ____________    ________    _____________    _________________

    1987    10       21            3             642        630           735        727          'PS'             1503         'NA'        53                   57               NaN         8          12          'LAX'     'SJC'    308         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       26            1            1021       1020          1124       1116          'PS'             1550         'NA'        63                   56               NaN         8           1          'SJC'     'BUR'    296         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       23            5            2055       2035          2218       2157          'PS'             1589         'NA'        83                   82               NaN        21          20          'SAN'     'SMF'    480         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       23            5            1332       1320          1431       1418          'PS'             1655         'NA'        59                   58               NaN        13          12          'BUR'     'SJC'    296         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       22            4             629        630           746        742          'PS'             1702         'NA'        77                   72               NaN         4          -1          'SMF'     'LAX'    373         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       28            3            1446       1343          1547       1448          'PS'             1729         'NA'        61                   65               NaN        59          63          'LAX'     'SJC'    308         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10        8            4             928        930          1052       1049          'PS'             1763         'NA'        84                   79               NaN         3          -2          'SAN'     'SFO'    447         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    1987    10       10            6             859        900          1134       1123          'PS'             1800         'NA'       155                  143               NaN        11          -1          'SEA'     'LAX'    954         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    :       :        :             :            :          :             :          :             :                :            :          :                    :                 :          :           :           :         :        :           :         :          :            :                   :           :               :               :           :                :
    :       :        :             :            :          :             :          :             :                :            :          :                    :                 :          :           :           :         :        :           :         :          :            :                   :           :               :               :           :                :

La pantalla indica que el número de filas, M, es actualmente desconocido. MATLAB muestra algunas de las filas y las elipsis verticales : indican que hay más filas en la tabla alta que no se están mostrando en este momento.

Crear horarios altos

Si los datos con los que está trabajando tienen un tiempo asociado con cada fila de datos, puede utilizar un horario alto para trabajar con los datos. Para obtener más información sobre la creación de horarios altos, consulte Capacidades ampliadas (timetable).

En este caso, la tabla alta tt tiene tiempos asociados con cada fila, pero estos se dividen en varias variables de tabla, como Year, Month, DayofMonth, etc. Combine todos estos elementos de información de fecha y hora en una sola variable nueva de fecha y hora alta Dates, que se base en los horarios de salida DepTime. A continuación, cree un horario alto utilizando Dates como los tiempos de la fila. Dado que Dates es la única variable de fecha y hora de la tabla, la función table2timetable la utiliza automáticamente para los tiempos de la fila.

hrs = (tt.DepTime - mod(tt.DepTime,100))/100;
mins = mod(tt.DepTime,100);
tt.Dates = datetime(tt.Year, tt.Month, tt.DayofMonth, hrs, mins, 0);
tt(:,1:8) = [];
TT = table2timetable(tt)
TT =

  M×21 tall timetable

            Dates           UniqueCarrier    FlightNum    TailNum    ActualElapsedTime    CRSElapsedTime    AirTime    ArrDelay    DepDelay    Origin    Dest     Distance    TaxiIn    TaxiOut    Cancelled    CancellationCode    Diverted    CarrierDelay    WeatherDelay    NASDelay    SecurityDelay    LateAircraftDelay
    ____________________    _____________    _________    _______    _________________    ______________    _______    ________    ________    ______    _____    ________    ______    _______    _________    ________________    ________    ____________    ____________    ________    _____________    _________________

    21-Oct-1987 06:42:00    'PS'             1503         'NA'        53                   57               NaN         8          12          'LAX'     'SJC'    308         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    26-Oct-1987 10:21:00    'PS'             1550         'NA'        63                   56               NaN         8           1          'SJC'     'BUR'    296         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    23-Oct-1987 20:55:00    'PS'             1589         'NA'        83                   82               NaN        21          20          'SAN'     'SMF'    480         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    23-Oct-1987 13:32:00    'PS'             1655         'NA'        59                   58               NaN        13          12          'BUR'     'SJC'    296         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    22-Oct-1987 06:29:00    'PS'             1702         'NA'        77                   72               NaN         4          -1          'SMF'     'LAX'    373         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    28-Oct-1987 14:46:00    'PS'             1729         'NA'        61                   65               NaN        59          63          'LAX'     'SJC'    308         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    08-Oct-1987 09:28:00    'PS'             1763         'NA'        84                   79               NaN         3          -2          'SAN'     'SFO'    447         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    10-Oct-1987 08:59:00    'PS'             1800         'NA'       155                  143               NaN        11          -1          'SEA'     'LAX'    954         NaN       NaN        0            'NA'                0           NaN             NaN             NaN         NaN              NaN              
    :                       :                :            :          :                    :                 :          :           :           :         :        :           :         :          :            :                   :           :               :               :           :                :
    :                       :      

Crear arreglos altos

Cuando extrae una variable de una tabla alta o un horario alto, el resultado es un arreglo alto del tipo de datos subyacentes correspondiente. Un arreglo alto puede ser numérico, lógico, de fecha y hora, de duración, de duración del calendario, categórico, de cadenas o de celdas. Asimismo, puede convertir un arreglo en memoria A en un arreglo alto con tA = tall(A). El arreglo en memoria A debe tener uno de los tipos de datos admitidos.

Extraiga el retraso de llegada ArrDelay del horario alto TT. Esto crea una nueva variable de arreglo alto con dos tipos de datos subyacentes.

a = TT.ArrDelay
a =

  M×1 tall double column vector

     8
     8
    21
    13
     4
    59
     3
    11
    :
    :

Las funciones classUnderlying y isaUnderlying son útiles para determinar el tipo de datos subyacentes de un arreglo alto.

Evaluación diferida

Un aspecto importante de los arreglos altos es que, cuando se trabaja con ellos, la mayoría de las operaciones se realiza de inmediato. Estas operaciones parecen ejecutarse rápidamente, porque el cálculo real se aplaza hasta que solicite específicamente que se realicen los cálculos. Puede activar la evaluación de un arreglo alto con la función gather (para traer el resultado a la memoria) o la función write (para escribir el resultado en el disco). Esta evaluación diferida es importante, porque incluso un comando sencillo como size(X) ejecutado en un arreglo alto con mil millones de filas no es un cálculo rápido.

Mientras trabaja con arreglos altos, MATLAB realiza un seguimiento de todas las operaciones que se van a llevar a cabo. Esta información se utiliza para optimizar el número de pasadas por los datos que serán necesarias cuando solicite la salida con la función gather. De esta forma, es normal trabajar con arreglos altos no evaluados y solicitar la salida únicamente cuando lo necesite. Para obtener más información, consulte Deferred Evaluation of Tall Arrays.

Calcule la media y la desviación estándar del retraso de llegada. Utilice estos valores para construir los umbrales superior e inferior de los retrasos que se encuentren dentro de una desviación estándar de la media. Fíjese en que el resultado de cada operación indica que el arreglo no se ha calculado todavía.

m = mean(a,'omitnan')
m =

  tall double

    ?

Preview deferred. Learn more.
s = std(a,'omitnan')
s =

  tall

    ?

Preview deferred. Learn more.
one_sigma_bounds = [m-s m m+s]
one_sigma_bounds =

  M×N×... tall array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Preview deferred. Learn more.

Evaluación con gather

La ventaja de la evaluación diferida es que, cuando llega el momento de que MATLAB realice los cálculos, a menudo es posible combinar las operaciones de tal manera que se minimice el número de pasadas por los datos. Por lo tanto, aunque realice muchas operaciones, MATLAB solo realiza pasadas adicionales por los datos cuando es absolutamente necesario.

La función gather fuerza la evaluación de todas las operaciones en cola y trae la salida resultante a la memoria. Por este motivo, puede pensar en gather como puente entre los arreglos altos y los arreglos en memoria. Por ejemplo, no puede controlar los bucles if o while mediante un arreglo lógico alto, pero una vez que se evalúa el arreglo con gather se convierte en un arreglo lógico en memoria que puede utilizar en estos contextos.

Dado que gather devuelve el resultado completo en MATLAB, debe asegurarse de que el resultado quepa en la memoria.

Utilice gather para calcular one_sigma_bounds y traer el resultado a la memoria. En este caso, one_sigma_bounds necesita varias operaciones para realizar el cálculo, pero MATLAB combina las operaciones en una sola pasada por los datos. Como los datos son pequeños en este ejemplo, gather se ejecuta rápidamente. Sin embargo, la eliminación de pasadas por los datos adquiere importancia a medida que aumenta el tamaño de los datos.

sig1 = gather(one_sigma_bounds)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1.5 sec
Evaluation completed in 1.8 sec

sig1 =

  -23.4572    7.1201   37.6975

Puede especificar varias entradas y salidas para gather si quiere evaluar varios arreglos altos a la vez. Esta técnica es más rápida que llamar a gather varias veces. Por ejemplo, calcule el retraso de llegada mínimo y máximo. Si los calcula por separado, cada valor requiere una pasada por los datos que se van a calcular, lo que implica dos pasadas en total. En cambio, si calcula los valores simultáneamente, solo se requiere una pasada por los datos.

[max_delay, min_delay] = gather(max(a),min(a))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1.1 sec
Evaluation completed in 1.1 sec

max_delay =

        1014


min_delay =

   -64

Estos resultados indican que, de media, la mayoría de vuelos llega unos 7 minutos tarde. Pero está dentro de una desviación estándar que un vuelo llegue 37 minutos tarde o 23 minutos antes. El vuelo más rápido del conjunto de datos llegó en torno a una hora antes y el último vuelo se retrasó varias horas.

Guardar, cargar y crear puntos de control en arreglos altos

La función save guarda el estado de un arreglo alto, pero no copia ninguno de los datos. El archivo .mat resultante suele ser pequeño. Sin embargo, los archivos de datos originales deben estar disponibles en la misma ubicación para poder utilizar load posteriormente.

La función write realiza una copia de los datos y la guarda como una recopilación de archivos, lo que puede consumir una gran cantidad de espacio en disco. write ejecuta todas las operaciones pendientes en el arreglo alto para calcular los valores antes de escribirlos. Cuando write copia los datos, es independiente de los datos sin procesar originales. Por lo tanto, puede recrear el arreglo alto a partir de los archivos escritos aunque los datos sin procesar originales ya no estén disponibles.

Puede recrear el arreglo alto a partir de los archivos escritos creando un nuevo almacén de datos que dirija a la ubicación en la que se escribieron los archivos. Esta funcionalidad le permite crear puntos de control o instantáneas de datos de arreglos altos. Crear un punto de control es una buena manera de guardar los resultados del preprocesamiento de sus datos, de modo que los datos estén en un formato que se cargue de forma más eficaz.

Si tiene un arreglo alto TA, puede escribirlo en una carpeta location con el comando:

write(location,TA);

Más adelante, para reconstruir TA desde los archivos escritos, utilice los comandos:

ds = datastore(location);
TA = tall(ds);

Además, puede utilizar la función write para activar la evaluación de un arreglo alto y escribir los resultados en el disco. Este uso de write es similar al de gather, con la diferencia de que write no trae los resultados a la memoria.

Funciones compatibles

La mayoría de las funciones básicas trabaja de la misma forma con los arreglos altos que con los arreglos en memoria. Sin embargo, en algunos casos, la forma en que trabaja una función con los arreglos altos es especial o tiene limitaciones. Puede saber si una función admite arreglos altos y si tiene alguna limitación mirando la parte inferior de la página de referencia de la función en la sección Capacidades ampliadas (para ver un ejemplo, consulte filloutliers).

Para obtener una lista filtrada de todas las funciones de MATLAB que admiten arreglos altos, consulte Lista de funciones (arreglos altos).

Los arreglos altos son compatibles con varias toolboxes, lo que le permite hacer cosas como escribir algoritmos de machine learning, implementar apps independientes y ejecutar cálculos en paralelo o en un cluster. Para obtener más información, consulte Extend Tall Arrays with Other Products.

Consulte también

| | | |

Temas relacionados