Large Binary Data Files: Can I Animate while Simultaneously Loading the Next Data Block Into Memory from Disk?

1 visualización (últimos 30 días)
Hi There,
I'm making tools for visualizing very large data sets. A typical routine will often look something like:
function AnimateFile(fidIn,BytesPerStep,NumSteps,StepsPerBlock,GraphicsHandles)
NumBlocks = ceil(NumSteps/StepsPerBlock);
for BlockNum = 1:NumBlocks
DataBlock = fread(fidIn,[BytesPerStep StepsPerBlock],'*uint8');
for StepNum = 1:size(DataBlock,2)
MakePrettyPictures(DataBlock(:,StepNum),GraphicsHandles)
end
end
But of course this means that the animation runs in fits and starts as it jumps back and forth between rendering in the inner loop and waiting for the fread() in the outer loop to complete. Is there some way of making the fread() command run "in the background" to load up the data for the next block while the current block is being animated?
-Jan

Respuesta aceptada

Oleg Komarov
Oleg Komarov el 20 de Mayo de 2011
EDIT
  1. Read in first block
  2. Start timer which executes the TimerFcn after the previous execution has ended (so no hard coded delays). The TimerFcn now doesn't share the same workspace so it should be enough to pass DataBlock as an argument to make one single copy
  3. In the meantime the import should proceed overwriting the DataBlock with the condition that TimerFcn is working on the previous
Let me know if it works.
function AnimateFile(fidIn,BytesPerStep,NumSteps,StepsPerBlock,GraphicsHandles)
NumBlocks = ceil(NumSteps/StepsPerBlock);
% Read in first block
DataBlock = fread(fidIn,[BytesPerStep StepsPerBlock],'*uint8');
% Create timer object which executes mpp every .5 seconds with a delay of
% .5 second to wait for the first chunk of data to be loaded
t = timer('ExecutionMode' , 'fixedSpacing',...
'Period' , 0 ,...
'BusyMode' , 'queue' ,...
'TimerFcn' ,{@mpp,DataBlock,GraphicsHandles});
start(t);
for b = 2:NumBlocks
% Cannot load the third block if still executing the first
% Example: if b = 3 and TaskExecuted = 1 then it can proceed otherways wait
while b - get(t,'TasksExecuted') > 2 && strcmp(get(t,'Running'),'on')
pause(0.1)
end
% Overwrite
DataBlock = fread(fidIn,[BytesPerStep StepsPerBlock],'*uint8');
end
end
% Sub function
function mpp(varargin)
for StepNum = 1:size(varargin{3},2)
MakePrettyPictures(varargin{3}(:,StepNum),varargin{4})
end
end
  4 comentarios
Jan Rubak
Jan Rubak el 28 de Jul. de 2011
Hi Oleg,
Thank you for this. I got pulled off onto a different task, so I haven't had a chance to test this yet. I will report back after I do.
Cheers,
Jan

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Startup and Shutdown en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by