Почему сохранение в папке с именем 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 слишком велик для хранения в памяти, избегайте загрузки его в пространство подкачки, что было бы чрезвычайно громоздким.
Надеюсь это поможет.
Том
Здесь есть две вещи
- Хранение во время цикла for - это дорогостоящая операция, поскольку обычно она открывает файловый поток и закрывает его перед тем, как продолжить. Возможно, вы не сможете избежать этого.
- Второе - скорость хранения и скорость кеша. Скорее всего, программы используют временную папку для своих собственных временных файлов, и для их очистки используется сборщик мусора или программное обеспечение. Если вы начинаете открывать и закрывать поток файлов в этой папке, вы должны отправить запрос, чтобы получить эксклюзивный доступ для записи в папку. Это снова добавляет ко времени.
Если вы выполняете операции по обработке изображений, и у вас есть несколько изображений, вы можете столкнуться с трудностями при записи на жесткий диск из-за его скорости, кэша и текущей памяти, доступной для MATLAB.