Calculations/Data-Analyzer/+Helper/estimateDatasetMemory.m

79 lines
3.0 KiB
Matlab

function [SAVE_TO_WORKSPACE, runMemoryGB] = estimateDatasetMemory(dataSources, options)
% Estimate per-run memory and decide whether to save dataset to workspace
%
% Supports both raw data folders and a preselected run folder.
% --- Measured memory per image (bytes) ---
bytesPerFullImage = 37.75 * 1e6; % full OD image
bytesPerCroppedImage = 0.16 * 1e6; % cropped OD image
% --- Check available RAM on Windows ---
if ispc
[~, sys] = memory;
availableRAM = sys.PhysicalMemory.Available;
else
availableRAM = 8e9; % fallback: 8 GB if not Windows
end
SAVE_TO_WORKSPACE = true; % default, may change per run
runMemoryGB = []; % store per-run memory
% --- Case 1: selectedPath exists ---
if isfield(options, 'selectedPath') && isfolder(options.selectedPath)
runFolder = options.selectedPath;
files = dir(fullfile(runFolder, '*.h5'));
nFiles = numel(files);
if nFiles > 0
runBytes = nFiles * (bytesPerFullImage + bytesPerCroppedImage);
runMemoryGB(end+1,1) = runBytes/1e9;
if runBytes > 0.75 * availableRAM
SAVE_TO_WORKSPACE = false;
fprintf('[INFO] Selected run %s estimated size %.2f GB exceeds 75%% of available RAM. Saving to disk.\n', ...
runFolder, runBytes/1e9);
else
fprintf('[INFO] Selected run %s estimated size %.2f GB fits in memory.\n', ...
runFolder, runBytes/1e9);
end
end
% --- Case 2: fallback to raw data folders ---
else
for i_ds = 1:numel(dataSources)
ds = dataSources{i_ds};
if isfield(ds, 'baseFolder') && ~isempty(ds.baseFolder)
baseFolder = fullfile(ds.baseFolder, ds.sequence, ds.date);
else
baseFolder = fullfile(options.baseDataFolder, ds.sequence, ds.date);
end
for j_run = 1:numel(ds.runs)
runItem = ds.runs(j_run);
runID = sprintf('%04d', runItem);
runFolder = fullfile(baseFolder, runID);
if isfolder(runFolder)
files = dir(fullfile(runFolder, '*.h5'));
nFiles = numel(files);
if nFiles == 0
continue;
end
runBytes = nFiles * (bytesPerFullImage + bytesPerCroppedImage);
runMemoryGB(end+1,1) = runBytes/1e9;
if runBytes > 0.75 * availableRAM
SAVE_TO_WORKSPACE = false;
fprintf('[INFO] Run %s/%s estimated size %.2f GB exceeds 75%% of available RAM. Saving to disk.\n', ...
ds.sequence, runID, runBytes/1e9);
else
fprintf('[INFO] Run %s/%s estimated size %.2f GB fits in memory.\n', ...
ds.sequence, runID, runBytes/1e9);
end
end
end
end
end
end