Манипулирование большими наборами данных в Matlab с просьбой дать совет по нескольким вещам, по ячейкам и операциям с массивами чисел c с учетом производительности - PullRequest
0 голосов
/ 26 марта 2020

Это кросс-пост отсюда: Ссылка на пост в сообществе Mathworks

В настоящее время я работаю с большими наборами данных, я сохранил эти данные как matlab файлы с двумя самыми большими файлами: 9,5 ГБ и 5,9 ГБ. Эти файлы содержат массив ячеек размером 1x8 (это сделано для адресации и предотвращения смешивания данных из каждой из 8 ячеек, и я специально хотел избежать eval). Каждая ячейка содержит трехмерную двойную матрицу, для одной - 1001x2002x201, а для другой - 2003x1001x201 (при обработке я делаю 1 строку в конце, чтобы перейти к 2002).

Теперь я уже работаю мой скрипт и его обработка на сервере (64 ядра и много оперативной памяти, на моем ноутбуке произошел сбой matlab, так как мне требуется более 12 ГБ ОЗУ на windows). Тем не менее, все еще требуется несколько часов, чтобы завершить sh запуск моего сценария, и мне все еще нужно выполнить некоторые дополнительные операции с данными, поэтому я и спрашиваю совета.

Для некоторых больших массивов я нужно найти максимальное значение всего набора из всех 8 ячеек, обычно я запускаю a для l oop, чтобы получить максимум каждого cel и сохранять каждое значение во временном массиве цифр c, а затем использовать функцию max снова. Это будет работать наверняка, мне просто интересно, есть ли лучший, более эффективный способ.

После того, как я найду максимум, что мне нужно, чтобы сделать манипуляции со всеми этими данными, как правило, я бы сделал что-то подобное для массив:

B=A./maxvaluefound;
A(B > a) = A(B > a)*constant;

Теперь я мог бы поместить это в a для l oop, указать каждую ячейку и запустить это, однако я не уверен, насколько это будет эффективно. Как вы думаете, есть лучший способ для l oop, который не очень сложен / труден для реализации?

Есть еще одна вещь, которую мне нужно сделать, которая действительно важна, каждая ячейка, как я говорил ранее, является срез (рассмотрим время), а внутри каждого слайда находится значение для 3D-матрицы / графика. Теперь мне нужно интегрировать данные, чтобы получить больше срезов. Причина, по которой мне нужно это сделать, заключается в том, что мне нужно создавать фрагменты / кадры / графики для создания фильма / картинки. Я планирую построить трехмерные данные, используя scatter3, где эти данные представлены цветом. Я планирую использовать альфа-значения, чтобы они могли видеть сквозь так, чтобы можно было увидеть интенсивность на этом 3d графике. Тем не менее я понимаю, как использовать griddata, но, видимо, это довольно медленно. Некоторые из других методов, где трудно понять. Таким образом, что было бы лучшим способом интерполировать эти (временные) срезы эффективным способом по различным ячейкам в массиве ячеек? Пожалуйста, объясните, если можете, желательно с примером.

Я добавил пи c для информации о сервере Linux, на которой я его запускаю, обратите внимание, что я не могу обновить версию matlab к сожалению, это R2016a: Specs_server

Я также приложил часть своего кода, чтобы дать лучшее представление о том, что я делаю:

if (or(L03==2,L04==2)) % check if this section needs to be executed based on parameters set at top of file
    load('../loadfilewithpathnameonmypc.mat')
    E_field_650nm_intAll=cell(1,8); %create empty cell array
    parfor ee=1:8 %run for loop for cell array, changed this to a parfor to increase speed by approximately 8x
        E_field_650nm_intAll{ee}=nan(szxit(1),szxit(2),xres); %create nan-filled matrix in cell 1-8
        for qq=1:2:xres
            tt=(qq+1)/2; %consecutive number instead of spacing 2
            T1=griddata(Xsall{ee},Ysall{ee},EfieldsAll{ee}(:,:,qq)',XIT,ZIT,'natural'); %change data on non-uniform grid to uniform gridded data
            E_field_650nm_intAll{ee}(:,:,tt)=T1; %fill up each cell with uniform data
        end
    end
    clear T1
    clear qq tt
    clear ee
    save('../savelargefile.mat', 'E_field_650nm_intAll', '-v7.3')
end


if (L05==2) % check if this section needs to be executed based on parameters set at top of file
    if ~exist('E_field_650nm_intAll','var') % if variable not in workspace load it
        load('../loadanotherfilewithpathnameonmypc.mat');
    end

    parfor tt=1:8 %run for loop for cell array, changed this to a parfor to increase speed by approximately 8x
        CFxLight{tt}=nan(szxit(1),szxit(2),xres); %create nan-filled matrix in cells 1 to 8
        for qq=1:xres
            CFs=Cafluo3D{tt}(1:lxq2,:,qq)'; %get matrix slice and tranpose matrix for point-wise multiplication
            CFxLight{tt}(:,:,qq)=CFs.*E_field_650nm_intAll{tt}(:,:,qq); %point-wise multiple the two large matrices for each cell and put in new cell array
        end
    end
    clear CFs
    clear qq tt
    save('../saveanotherlargefile.mat', 'CFxLight', '-v7.3')
end
...