- Read in first block
- 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
- In the meantime the import should proceed overwriting the DataBlock with the condition that TimerFcn is working on the previous
Large Binary Data Files: Can I Animate while Simultaneously Loading the Next Data Block Into Memory from Disk?
조회 수: 1 (최근 30일)
이전 댓글 표시
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
댓글 수: 0
채택된 답변
Oleg Komarov
2011년 5월 20일
EDIT
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
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Startup and Shutdown에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!