我有一个相对较大的文件,我想使用GUIDE绘制交互式绘图,绘制一段文件,并在scrollEvent窗口更新。 (数据适当重新绘制)。使用Matlab parfeval的性能损失?
为此,获取大小为窗口大小4倍的缓冲区,当窗口的中心达到缓冲区的75%时,缓冲区被重新写入,以使窗口位于新缓冲区的中心。
的问题,这是一个使用fread
,当它当然块,直到完成。(这是视觉干扰)
我想什么是创建一个单独的readData
函数被调用f = parfeval(gcp(),@readData,1,datafile)
和[~,buffer]=fetchNext(f)
的buffer
坚持在handles.datafile
。
问题:即使在我的例子(见下文)readData
只被调用一次,以后每绘图是慢得令人难以置信(10X不使用parfeval
时的运行时间)。
实施例:
./test.dat
通过dd if=/dev/urandom of=test.dat bs=100000 count=1024
**这是同步代码,以获得异步之一产生,注释掉parfeval
和fetchNext
函数定义遮蔽平行的。
function test()
f = figure('Toolbar','none','Menubar','none');
ax = axes(f);
data = struct( 'file','./test.dat',...
'buffer',[],...
'window',[0,100000]);
p = gcp();
data.fileReader = parfeval(p,@readData,1,data);
handles = struct('axes',ax,'figure',f,'data',data);
guidata(f,handles);
set(f,'WindowScrollWheelFcn',@scrollHandler);
end
function f = parfeval(~,fun,~,in1)
f = struct('output',fun(in1));
end
function [id,out] = fetchNext(f,varargin)
id = 1;
out = f.output;
end
function buffer = readData(data)
file = fopen(data.file,'r');
buffer = fread(file,[128,400000],'int16');
fclose(file);
end
function scrollHandler(hObject, eventdata, ~)
handles = guidata(hObject);
ax = handles.axes;
C = get (ax, 'CurrentPoint');
XLim = get(ax, 'XLim');
YLim = get(ax, 'YLim');
if XLim(1)<=C(1,1) && XLim(2)>=C(1,1) && ...
YLim(1)<=C(1,2) && YLim(2)>=C(1,2)
tic;
window = handles.data.window;
if isstruct(handles.data.fileReader) || handles.data.fileReader ~= -1
fprintf('Reading from file\n');
[~,handles.data.buffer] = fetchNext(handles.data.fileReader);
handles.data.fileReader = -1;
end
if eventdata.VerticalScrollCount > 0 && window(2) < 399000
window = window + 1000;
else
if window(1) > 1000
window = window - 1000;
end
end
handles.data.window = window;
guidata(hObject, handles);
plot(ax,handles.data.buffer(65,window(1)+1:window(2)));
toc
end
end
我试图用你的代码重现这一点,但我不清楚如何正确地与它进行交互。如果您可以生成更简单的独立代码复制,这将非常有帮助。另外,看起来好像你在暗示一个先前的“parfeval”调用会以某种方式放慢后续的绘图? – Edric
@Edric将该示例更新为仅限代码的示例。 – Adam