绘制大数据文件时出现MATLAB错误消息?

时间:2014-01-14 14:39:45

标签: matlab indexing bigdata textscan

我编写的代码用于绘制来自非常大的.txt文件(20Gb到60Gb)的数据。 .txt文件包含两列数据,表示我做过的实验中两个传感器的输出。数据文件如此之大的原因是数据以4M样本/秒记录。 该代码适用于绘制相对较小的.txt文件(10Gb),但是当我尝试绘制更大的数据文件(60Gb)时,我收到以下错误消息:

Attempted to access TIME(0); index must be a
positive integer or logical.

Error in textscan_loop (line 17)
  TIME =
  ((TIME(end)+sample_rate):sample_rate:(sample_rate*(size(d,1)))+(TIME(end)));%shift
  Time along

我的代码背后的基本思想是通过将磁盘上的.txt数据的Nlines读取到RAM中的Matlab变量C,绘制C然后清除C来节省RAM。此过程在循环中进行,因此数据以块的形式绘制,直到到达.txt文件的结尾。代码可以在下面找到:

Nlines = 1e6; % set numbe of lines to sample per cycle
sample_rate = (1); %sample rate
DECE= 1000;% decimation factor

TIME = (0:sample_rate:sample_rate*((Nlines)-1));%first inctance of time vector
format = '%f\t%f';
fid = fopen('H:\PhD backup\Data/ONK_PP260_G_text.txt');

while(~feof(fid))

  C = textscan(fid, format, Nlines, 'CollectOutput', true);
  d = C{1};  % immediately clear C at this point you need the memory! 
  clearvars C ;
  TIME = ((TIME(end)+sample_rate):sample_rate:(sample_rate*(size(d,1)))+(TIME(end)));%shift Time along 
  plot((TIME(1:DECE:end)),(d(1:DECE:end,:)))%plot and decimate
  hold on;
  clearvars d;
end

fclose(fid);

我认为while循环在代码停止执行之前大约110个周期并且显示错误消息,我知道这是因为图表显示了大约110e7个数据点,并且循环一次处理1e6个数据点。

如果有人知道为什么会出现此错误,请告知我们。

干杯, 吉姆

1 个答案:

答案 0 :(得分:1)

您遇到的错误实际上不是在绘图中,而是在参考线中。

虽然我无法重现确切的错误,但我怀疑它与此有关:

Time = 1:0
Time(end)

无论如何,前进的道路是明确的。您需要使用dbstop if error运行此代码,并观察引发错误的行中的所有相关变量。

从这里你可能会发现导致问题的原因,希望只是一些简单的事情,比如你的代码无法处理的数据大小是1000左右的精确倍数。


尝试将plot用于大数据是有问题的,因为matlab正试图绘制每个数据点。

显然屏幕不会显示所有这些点(许多点会重叠),因此建议仅绘制相关点。可以像你似乎尝试的那样手动进行二次采样和手动执行,但幸运的是我们有一个现成的解决方案:

The Plot (Big) File Exchange Submission

以下是介绍:

  

这个简单的工具拦截进入绘图的数据并将其缩小为   考虑到数量的最小可能集合   屏幕上可用的像素。然后它以用户身份更新数据   放大或平底锅。当用户必须绘制非常大的内容时,这非常有用   数据量并以视觉方式进行探索。

     

这适用于MATLAB的内置线图功能,允许使用   要保留的功能。

     

而不是:

     

plot(t,x);

     

可以使用:

     

reduce_plot(t,x);

     

大多数绘图选项,例如多个系列和线属性,都可以   传入也是如此,'reduce_plot'在很大程度上是一种闯入   替换'情节'。

     

h = reduce_plot(t,x(1,:),'b:',t,x(2,:),t,x(3,:),'r - *');

     

此函数适用于“x”数据始终增加的图,   这是最常见的,例如时间序列。