Почему сохранение в папке с именем temp приводит к замедлению загрузки данных в цикле for в Matlab?

ВАЖНОЕ ОБНОВЛЕНИЕ

Я только что обнаружил, что после перезапуска Matlab и компьютера этот упрощенный код больше не воспроизводит проблему и для меня... Мне очень жаль, что я потратил ваше время на сценарий, который не работал. Однако старая проблема все еще сохраняется в моем исходном скрипте, если я сохраняю что-либо в любой папке (которую я пробовал) во внутреннем цикле for. В моих целях я обошел это, просто не спасая, если мне это абсолютно не нужно. Исходный сценарий имеет следующую структуру с точки зрения for петли и использование save или же load:

load() % .mat files, size 365x92x240
for day = 1:365
    load() % .mat files, size 8x92x240

    for type = 1:17
        load() % .mat files size 17x92x240
        load() % .mat files size 92x240

        for step 1:8
            %only calculations
        end
        save() % .mat files size 8x92x240

    end 
    save() % .mat files, size 8x92x240
end

% the load and saves outside the are in for loops too, but do not seem to affect the described behavior in the above script
load() % .mat files size 8x92x240
save() % .mat files size 2920x92x240
load() 
save() % .mat files size 365x92x240
load()
save() % .mat files size 12x92x240

При полном запуске сценарий сохраняет ок. 10 Гб и нагрузок ок. 2 Гб данных.

Весь сценарий довольно длинный и много экономит и загружает. Было бы довольно непрактично делиться всем здесь, прежде чем мне, к сожалению, удалось воспроизвести проблему в сокращенной версии. Когда я разочарованно обнаружил, что время от времени один и тот же код может вести себя по-разному, он сразу же стал более утомительным, чем предполагалось, чтобы найти упрощение, которое последовательно воспроизводит поведение. Я вернусь, как только буду уверен в управляемом коде, который создает проблему.


ПРЕДЫДУЩАЯ ХАРАКТЕРИСТИКА ПРОБЛЕМЫ (ПРИМЕЧАНИЕ. Приведенный ниже код точно не воспроизводит описанную проблему.):

Я только что узнал, что в Matlab вы не можете назвать папку для сохранения в temp в for цикл без замедления загрузки данных в следующем цикле цикла. У меня вопрос почему?

Если вы заинтересованы в воспроизведении проблемы самостоятельно, см. Код ниже. Чтобы запустить его, вам также понадобится matfile с именем anyData.mat для загрузки и две папки для сохранения, одна называется temp, а другая - временная.

clear all;clc;close all;profile off;
profile on

tT= zeros(1,endDay+1);
tTD= zeros(1,endDay+1);

for day = 0:2;
    tic
    T = importdata('anyData.mat')
    tT(day+1)=toc; %loading time in seconds

    tic
    TD = importdata('anyData.mat')
    tTD(day+1)=toc;

    for type = 0:1
        saveFile = ones(92,240);

        save('AnyFolder\temporary\saveFile.mat', 'saveFile') % leads to fast data loading 
        %save('AnyFolder\temp\saveFile.mat', 'saveFile') %leads to slow data loading

    end % end of type 

end% end of day

profile off
profile report

plot(tT)

По оси Y графика вы увидите, что загрузка данных занимает значительно больше времени, чем в for цикл сохранить в временную, а не временную. Есть ли кто-нибудь, кто знает, почему это происходит?

2 ответа

Я не могу воспроизвести проблему, подозреваю, что это зависит от системы и размера данных. Но некоторые общие комментарии, которые могут помочь вам выйти из затруднительного положения:

Как отмечают комментаторы и приведенные выше ответы, файловый ввод / вывод в цикле double for может быть крайне паразитным, особенно в тех случаях, когда вам нужен только доступ к части данных в файле, когда другие системные операции задерживают процесс, или где файлы данных достаточно велики, чтобы для их загрузки требовалась виртуальная память (windows) / пространство подкачки (linux). В последнем случае вы можете оказаться в ситуации, когда вы перемещаете файл с одной части жесткого диска на другую, когда открываете его!

Я предполагаю, что вы загружаете / сохраняете, потому что у вас нет 10 ГБ оперативной памяти для хранения всего в памяти для вычислений. Фактическая проблема не описана, поэтому я не могу быть уверен, но думаю, что вы можете обнаружить, что matfile класс, чтобы быть полезным... документация TMW. Это используется для отображения непосредственно в / из файла мата. Это:

  • уменьшает поток файлов, открывающий и закрывающий IOPS

  • допускает произвольно большие размеры переменных (определяется размером диска, а не памятью)

  • позволяет читать / писать частично (т.е. записывать только некоторые элементы массива без загрузки всего файла)

  • в случае, если ваш файл mat слишком велик для хранения в памяти, избегайте загрузки его в пространство подкачки, что было бы чрезвычайно громоздким.

Надеюсь это поможет.

Том

Здесь есть две вещи

  1. Хранение во время цикла for - это дорогостоящая операция, поскольку обычно она открывает файловый поток и закрывает его перед тем, как продолжить. Возможно, вы не сможете избежать этого.
  2. Второе - скорость хранения и скорость кеша. Скорее всего, программы используют временную папку для своих собственных временных файлов, и для их очистки используется сборщик мусора или программное обеспечение. Если вы начинаете открывать и закрывать поток файлов в этой папке, вы должны отправить запрос, чтобы получить эксклюзивный доступ для записи в папку. Это снова добавляет ко времени.

Если вы выполняете операции по обработке изображений, и у вас есть несколько изображений, вы можете столкнуться с трудностями при записи на жесткий диск из-за его скорости, кэша и текущей памяти, доступной для MATLAB.

Другие вопросы по тегам