2017-06-20 78 views
0

我有一个相对较大的文件,我想使用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

**这是同步代码,以获得异步之一产生,注释掉parfevalfetchNext函数定义遮蔽平行的。

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 
+0

我试图用你的代码重现这一点,但我不清楚如何正确地与它进行交互。如果您可以生成更简单的独立代码复制,这将非常有帮助。另外,看起来好像你在暗示一个先前的“parfeval”调用会以某种方式放慢后续的绘图? – Edric

+0

@Edric将该示例更新为仅限代码的示例。 – Adam

回答

1

这确实很神秘。这个问题似乎与guidataparfeval返回的parallel.FevalFuture有某种相互作用。作为一种解决方法,您可以简单地避免覆盖结构的该元素。换句话说,删除行

handles.data.fileReader = -1; 

你还需要检查handles.data.fileReader.Read,以确保你不要试图对已经完成的未来再次调用fetchNext

+0

这确实有用,谢谢 – Adam