1

我编写了代码来绘制来自非常大的 .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 读取 N 行数据到 RAM 中的 Matlab 变量 C 来节省 RAM,绘制 C 然后清除 C。此过程循环发生,因此数据以块的形式绘制,直到结束.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 个数据点。

如果有人知道为什么会发生此错误,请告诉我。

干杯,吉姆

4

1 回答 1

1

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

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

Time = 1:0
Time(end)

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

从这里您可能会找出导致问题的原因,希望只是一些简单的事情,例如您的代码无法处理大约 1000 倍的数据大小。


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

显然屏幕不会显示所有这些点(很多会重叠),因此建议只绘制相关点。正如您似乎已经尝试过的那样,您可以手动进行二次采样并手动执行此操作,但幸运的是我们有一个现成的解决方案:

情节(大)文件交换提交

下面是介绍:

这个简单的工具截取进入绘图的数据,并将其减少到最小可能的集合,在给定屏幕上可用的像素数量的情况下看起来相同。然后它会在用户缩放或平移时更新数据。当用户必须绘制大量数据并进行可视化探索时,这很有用。

这适用于 MATLAB 的内置线图函数,允许保留这些函数的功能。

代替:

情节(t,x);

可以使用:

reduce_plot(t, x);

大多数绘图选项,例如多个系列和线条属性,也可以传入,因此“reduce_plot”在很大程度上是“绘图”的替代品。

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

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

于 2014-01-14T14:57:25.343 回答