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 perezosa 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 perezosa
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 perezosa 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 Lazy 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 perezosa 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
gather
| tall
| datastore
| table
| mapreducer