2016-01-29 125 views
1

我從連接到Arduino的加速度計讀取一些讀數,並通過串行通信連接到MATLAB。我想將這些讀數寫入一個文本文件。 10秒的讀數將寫入大約1000個條目,使文本文件大小約爲1千字節。如何使用Matlab將「​​大數據」寫入文本文件

我將使用下面的代碼:

%%%%%// Communication %%%%% 
arduino=serial('COM6','BaudRate',9600); 
fopen(arduino); 
fileID = fopen('Readings.txt','w'); 

%%%%%// Reading from Serial %%%%% 
for i=1:Samples 
    scan = fscanf(arduino,'%f'); 
    if isfloat(scan), 
     vib = [vib;scan]; 
     fprintf(fileID,'%0.3f\r\n',scan); 
    end 
end 

改善這段代碼有什麼建議?這會有一個時間或大小的限制?此代碼將運行3天。

+0

格式實際上是我努力讓人們更容易閱讀的方式,這是一種人們不完美的嘗試@Adriaan – AnarKi

回答

2
  1. 不要使用文本文件,使用二進制文件。 42718123229.123123在ASCII中是18個字節,在二進制文件中是4個字節。不要浪費空間不必要的。如果您的數據稍後將在MATLAB中使用,那麼我只建議您保存在.mat文件中

  2. 請勿使用單個文件!選擇一個合理的文件大小(例如100Mb),並確保當你達到很多數據量時,切換到另一個文件。你可以通過例如每小時保存一個文件。這樣可以最大限度地減少軟件在完成前2分鐘崩潰時可能發生的錯誤。

+0

它是一個非只寫入一個文件的好主意,我會迭代並寫入當文件達到一定大小時,您建議使用不同的文件。 我現在正在查看二進制文件,謝謝 – AnarKi

+4

10秒= 1kb,3天= 259,200秒。所以你的最終數據大小應該是25.92 MB - 不會那麼大,但@AnderBiguri是對的,你應該總是保存你的數據流入更小的塊/批次(也許值得只是保存一份原始的如果Matlab輸出的結果被污染/錯誤) – GameOfThrows

+0

@GameOfThrows哦,我沒有意識到它的尺寸很小。但事實上,正如你所說,爲了安全起見,最好是節省時間 –

1

現在知道問題的實際尺寸,編寫一個文本文件就完全沒有問題,處理這樣的小數據沒有什麼特別的要求。但是你的代碼有問題。您正在編寫隨時間推移而增加的變量vid。這可能會導致性能不佳,因爲您沒有使用預分配,並且可能會消耗大量內存。我強烈建議不要保留這個變量,如果你需要讀者之後閱讀它。

你應該考慮的另一件事是驗證你的數據。當你收到的樣本少於預期時,你會做什麼?包括時間戳!請注意,這些時間戳並不精確,因爲之後添加了這些時間戳,但它允許您確定是否缺少一些隨機樣本(可能會後來插入),或者可能會丟失一些連續的100個樣本系列。

+0

是否有預先分配尺寸的方法,而不僅僅是估計並添加一點點以估計它連續3天后的尺寸跑步? – AnarKi

+0

它真的打算保留您在內存中讀取的所有數據嗎?我建議不要這樣做,而是使用書面文件進行分析。 – Daniel

+0

你的意思是直接寫入一個.mat文件,我每次掃描一系列對應的東西? – AnarKi

相關問題