我编写的代码用于绘制来自非常大的.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个数据点。
如果有人知道为什么会出现此错误,请告知我们。
干杯, 吉姆
答案 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”数据始终增加的图, 这是最常见的,例如时间序列。